Может ли свойство класса PHP быть равным другому свойству класса?

Я хочу сделать это:

class MyClass {
   var $array1 = array(3,4);
   var $array2 = self::$array1;
}

и $array2 не работает.

У вас есть решение/трюк, чтобы сделать свойство класса равным другому свойству класса?


person Community    schedule 25.01.2009    source источник


Ответы (3)


Согласно PHP Manual:

Значение по умолчанию должно быть константным выражением, а не (например) переменной, членом класса или вызовом функции.

Что вы МОЖЕТЕ сделать, это:

class MyClass {
    var $array1 = array(3,4);
    var $array2 = array();

    function MyClass() {
        $this->array2 = $this->array1;
    }
}

Функция MyClass (или __construct, если вы работаете в PHP5) будет вызываться каждый раз при создании нового объекта, поэтому любые экземпляры MyClass будут иметь свойство array2, имеющее то же значение, что и его свойство array1.

$myclass = new MyClass();
print_r($myclass->array1); // outputs Array ( [0] => 3 [1] => 4 ) 
print_r($myclass->array2); // outputs Array ( [0] => 3 [1] => 4 ) 
person Paolo Bergantino    schedule 25.01.2009

Я новичок в PHP, но ответ Паоло, кажется, просто инициализирует значения одинаковыми в конструкторе, но на самом деле это не делает обе переменные ссылающимися на одно и то же содержимое. Как насчет этого:

class MyClass {
    var $array1 = array(3,4);
    var $array2 = array();

    function MyClass() {
        $this->array2 = &$this->array1;
    }
}

$myclass = new MyClass();
print_r($myclass->array1); // outputs Array ( [0] => 3 [1] => 4 ) 
print_r($myclass->array2); // outputs Array ( [0] => 3 [1] => 4 )
echo "<br />";
$myclass->array1[0] = 1;
$myclass->array2[1] = 2;
print_r($myclass->array1); // outputs Array ( [0] => 1 [1] => 2 ) 
print_r($myclass->array2); // outputs Array ( [0] => 1 [1] => 2 )

При добавлении ссылки оба значения свойства класса изменяются при изменении любого из них. Я что-то упускаю?

person notruthless    schedule 25.01.2009
comment
Из его вопроса у меня не сложилось впечатление, что он хотел, чтобы они ссылались друг на друга, просто он хотел, чтобы они изначально были одинаковыми. - person Paolo Bergantino; 25.01.2009
comment
О, хорошо, тогда я неправильно понял вопрос! - person notruthless; 25.01.2009

Оба ваших ответа, Paolo и notruthless, превосходны, большое спасибо!

Если я хочу, чтобы два свойства синхронизировались:

function MyClass() {
    $this->array2 = &$this->array1;
}

Если я хочу, чтобы два массива изначально имели одинаковые значения, но затем хочу изменить их по отдельности, я удаляю «&»:

function MyClass() {
    $this->array2 = $this->array1;
}
person Community    schedule 25.01.2009
comment
Просто сделайте свой код удобным для PHP 5, назвав функцию-конструктор просто __construct() вместо MyClass(). - person Michał Niedźwiedzki; 26.01.2009