2013-11-26 3 views
-2
class Test 
{ 
    private $private = ""; 

    public function add($string) { 
     $this->private[] = $string; 
    } 

    public function evaluate(Test $container) { 
     return $container->private; 
    } 
} 

$test = new Test(); 
$test->add("zero"); 
$test->add("one"); 
$test->add("two"); 

$result = new Test(); 
print_r($result->evaluate($test)); 

Приведенный выше код демонстрирует дамп частной строки, как это возможно? Тогда почему это называется «частным»?«Частный» не совсем частный?

Может кто-нибудь объяснить это мне?

Выход:

Array (
    [0] => one 
    [1] => two 
    [2] => four 
) 
+3

Потому что вы называете это другой функцией в своем классе. Он доступен только для текущего класса и любых расширенных классов. Если вы попытаетесь напрямую вызвать '$ result-> private', это не сработает. –

+0

Закрыто для этого класса. Вы не можете получить доступ к нему со стороны. – MurifoX

+1

@BenFortune Я считаю, что вам не хватает вопроса, он обращается к частному атрибуту из другого экземпляра того же класса. – smassey

ответ

2

Поскольку вы вызываете эту частную собственность из внутри класса. private означает, что он может использоваться только свойствами и методами внутри собственного класса. Вы вызываете метод, которому разрешено использовать это свойство. Частные свойства доступны по своему классу, даже если это другой экземпляр класса.

Вы найдете следующее:

print_r($result::$private); 

Даст вам ошибку:

Fatal error: Cannot access private property

+0

Спасибо за ваш ответ :) –

0

Это потому, что даже несмотря на то, attribute $private является частным, класс Test еще знает об этом и может доступ к нему, хотя это другой экземпляр. Если вы должны были создать второй класс Test2() с тем же evaluate method, который ожидает экземпляр Test, тогда оценка завершится неудачно. Это немного сложно, но класс Test знает все о своих членах даже из удаленных экземпляров.

0

public function evaluate является общедоступным и может иметь доступ к частной переменной внутри класса. вы не можете направить доступ к общедоступной переменной, как $result->$private

0

является закрытым, потому что вы не можете получить доступ к этой переменной/члену вне класса.

1

private в PHP означает частный для любого объекта того же типа.

Как stated here in the PHP manual:

Objects of the same type will have access to each others private and protected members even though they are not the same instances.

Да, он отличается от других языков, но это документально, и это, как она работает.

+0

И было бы больно реализовать метод equals, если бы это было не так –

Смежные вопросы