2012-05-27 40 views
19

bạn có thể khởi tạo một mảng tĩnh đối tượng trong một lớp trong PHP không? Giống như bạn có thể làmPHP - xác định mảng tĩnh của các đối tượng

class myclass { 
    public static $blah = array("test1", "test2", "test3"); 
} 

nhưng khi tôi làm

class myclass { 
    public static $blah2 = array(
     &new myotherclass(), 
     &new myotherclass(), 
     &new myotherclass() 
    ); 
} 

nơi myotherclass được định nghĩa ngay trên myclass. Tuy nhiên, lỗi đó sẽ gây ra lỗi; có cách nào để đạt được nó không?

+0

Ông có thể cho chúng tôi biết rằng lỗi là gì? – xbonez

+4

Đặt '$ blah2' trong hàm tạo. Bạn không thể đặt giá trị được tính toán theo thời gian trong định nghĩa thuộc tính. – Wiseguy

+0

@Wiseguy tôi có nhận được tin nhắn của bạn đúng không? – Brett

Trả lời

24

Không. Từ http://php.net/manual/en/language.oop5.static.php:

Giống như bất kỳ biến tĩnh khác PHP, thuộc tính tĩnh chỉ có thể được khởi tạo bằng một chữ hoặc liên tục; biểu thức không được phép. Vì vậy, trong khi bạn có thể khởi tạo một thuộc tính tĩnh thành một số nguyên hoặc mảng (ví dụ), bạn không thể khởi tạo nó thành biến khác, với giá trị trả về hàm hoặc cho một đối tượng.

Tôi sẽ khởi tạo thuộc tính là null, đặt riêng tư bằng phương thức truy cập và có người truy cập thực hiện khởi chạy "thực" lần đầu tiên được gọi. Dưới đây là ví dụ:

class myclass { 

     private static $blah2 = null; 

     public static function blah2() { 
      if (self::$blah2 == null) { 
       self::$blah2 = array(new myotherclass(), 
       new myotherclass(), 
       new myotherclass()); 
      } 
      return self::$blah2; 
     } 
    } 

    print_r(myclass::blah2()); 
1

Trong khi bạn không thể khởi tạo nó để có các giá trị này, bạn có thể gọi phương thức tĩnh để đẩy chúng vào bộ sưu tập nội bộ của riêng mình như tôi đã thực hiện bên dưới. Điều này có thể gần như bạn sẽ nhận được.

class foo { 
    public $bar = "fizzbuzz"; 
} 

class myClass { 
    static public $array = array(); 
    static public function init() { 
    while (count(self::$array) < 3) 
     array_push(self::$array, new foo()); 
    } 
} 

myClass::init(); 
print_r(myClass::$array); 

Demo: http://codepad.org/InTPdUCT

Những kết quả trong các kết quả sau:

Array 
(
    [0] => foo Object 
    (
     [bar] => fizzbuzz 
    ) 
    [1] => foo Object 
    (
     [bar] => fizzbuzz 
    ) 
    [2] => foo Object 
    (
     [bar] => fizzbuzz 
    ) 
)
Các vấn đề liên quan