Я понимаю ООП. До сих пор я понимаю, что на закрытый и защищенный нельзя ссылаться извне класса, используя нотацию $ this-> blah. Если это правильно, как может работать следующий код?
<?php
class test {
protected $a = "b";
public static function oo(){
$instance = new static();
echo $instance->a;
}
}
test::oo();
Дает мне вывод б! Теперь, как, во имя Господа, это может произойти?
В PHP 5.3 была добавлена новая функция, называемая поздними статическими привязками — и это может помочь нам получить полиморфное поведение, которое может быть предпочтительным в этой ситуации. Проще говоря, поздние статические привязки означают, что вызов статической функции, которая наследуется, будет «привязываться» к вызывающему классу во время выполнения. Итак, если мы используем позднюю статическую привязку, это будет означать, что когда мы сделаем вызов «test :: oo ();», будет вызвана функция oo () в тестовом классе. После этого вы вернете $ instance-> а; Ключевое слово static позволяет функции связываться с вызывающим классом в runtime.so, если вы используете static, то какой бы модификатор доступа (приватный, публичный, защищенный) вы ни использовали, он просто означает меньше …
пожалуйста прочтите это ссылка на сайт,другой
Это происходит потому, что вы «представляете это» echo
об этом. Вы не можете ссылаться на это, например, так:
class test {
private $a = 'b';
function __construct() {
echo 'instantiated';
}
}
$test = new test();
echo $test->a; // This line won't work, since it's a private var.
Это даст вам сообщение об ошибке, которое выглядит так:
Неустранимая ошибка: невозможно получить доступ к тесту частной собственности :: $ a
Example (https://eval.in/226435)
Как я уже говорил, вы получаете доступ к нему из в сам класс, так что вы можете просмотреть его. (Это $instance
у вас есть.) Если вы измените свой код, чтобы использовать его следующим образом:
class test {
protected $a = "b";
public static function oo(){
$instance = new static();
return $instance;
}
}
echo test::oo()->a;
Example of the above (https://eval.in/226439)
Вы получите эту ошибку «Private Acess Blah Blah».
Вы неправильно поняли утверждение. "private and protected cannot be referenced from outside the class"
означает, что, как показывают вышеприведенные примеры, вы НЕ МОЖЕТЕ получить доступ к переменным вне класса, но в вашем примере вы обращаетесь к нему из INSIDE класса, что означает, что они будут делать то, что вам нужно (echo
как ты)
Пока я понимаю, что на частную и защищенную нельзя ссылаться извне класса
Как следует, так как oo
определяется в том же типе, что и a
, oo
имеет доступ к a
,