vovchik542
Новичок
Не логичнее было бы ввести конструкцию $parent вместо parent:: по аналогии с $this, ведь мы обращаемся к свойствам и методам ОБЬЕКТА, пусть и в контексте класса-предка.
наверное, не подумал об этом.Обратная совместимость скорее всего.
непонятно что хотите,честно говоря не придумал ситуации похожей на ваше описание когда будет запрет на чтение,приведите пример когда нельзя,можно кодоми еще вопросик, почему статические методы можно вызывать через обьект, а свойства нет?
fixxxer@mbp ~$ php -r 'class A { function __construct() { $this = 4; var_dump($this); } }; new A;'
Fatal error: Cannot re-assign $this in Command line code on line 1
fixxxer@mbp ~$ php -r 'class A { function __construct() { ${"th"."is"} = 4; var_dump($this); } }; new A;'
int(4)
$this = 4;
${"th"."is"} = 4;
Я понимаю что $this это переменная. Ну и была бы себе переменная $parent, указывающая на экземпляр родительского класса, не вижу проблем...$this это переменная , которую можно куда нибудь присвоить итд , parent это не переменная
Я уже разобрался, сделано чтобы можно было динамически добавлять свойства в обьект. При этом оно создастся даже если существует статическое с таким же именем (хотя при определении класса сделать статическое и нестатическое с одинаковыми именами нельзя)непонятно что хотите,честно говоря не придумал ситуации похожей на ваше описание когда будет запрет на чтение,приведите пример когда нельзя,можно кодом
class A {
static public $a = "static";
}
echo A::$a; // static
$A = new A();
echo $A->a; // Notice: Undefined property: A::$a
$A->a = "object";
echo $A->a; // object
echo A::$a; // static
Да просто из-за обратной совместимости разработчики иногда добавляют костыли. Зачем для позднего динамического связывания вводить новое ключевое слово static. Можно было изменить поведение self (а если уж очень нужно вызвать метод/свойство родителя то можно имя соотв. класса написать)vovchik542. А смысл всех этих вопросов?
Есть ситнтаксис. Есть документация, что и как работает.
Чего ещё надо ?
Спрашиваю мнение других, может кто укажет почему именно таким образом сделано. Изучаю реализацию ООП в PHPа в чем вопрос-то к комьюнити?![]()
class Foo {
public function bar($child) {
$child->call();
}
}
class Child extends Foo {
public function bar() {
//parent::bar2();
Foo::bar($this);
}
protected function call() {
echo "Предок вызвал закрытый метод потомка";
}
}
$obj = new Child();
$obj->bar();
И как раз здесь логичнее бы смотрелось $parent->bar()$this - это объект данного класса
parent - это не объект. скорее статический метод вызываемый в контексте текущего объекта.
вот пример, он некоректен, но даёт понятие как примерно это работает.
PHP:class Foo { public function bar($child) { $child->call(); } } class Child extends Foo { public function bar() { //parent::bar2(); Foo::bar($this); } protected function call() { echo "Предок вызвал закрытый метод потомка"; } } $obj = new Child(); $obj->bar();
и откуда там должен взяться экземпляр родительского класса?была бы себе переменная $parent, указывающая на экземпляр родительского класса, не вижу проблем...
parent это не статический методparent - это не объект. скорее статический метод
$parent тут смотрелся бы не логичнее, ибо это не указатель, подобный $this, который можно return-ить и передавать как самодостаточный объект (т.е. как ссылку на объект), а просто _указание_ вызвать родительский метод, если даже он предопределен в классе-потомке:И как раз здесь логичнее бы смотрелось $parent->bar()
class parent_ {
function foo() {
echo 'parent';
}
}
class child extends parent_ {
function foo() {
echo 'child';
}
function run() {
parent::foo(); // parent
$this->foo(); // child
}
function returning() {
return parent; // глупость, выдает ошибку
return $this; // возвращаем сами себя
}
}
$child = new child();
$child->run();
print_r($child->returning());
$this это тоже еще не инстанцированный обьект когда к $this обращаться в конструкторе и не отработал ни он ни деструктор.переменная это уже инстанцированный объект у которого должен отработать конструктор, а затем деструктор. зачем объект, там где фактически нужен просто вызов метода а-ля статичсекий.
$parent тут смотрелся бы не логичнее, ибо это не указатель, подобный $this, который можно return-ить и передавать как самодостаточный объект (т.е. как ссылку на объект), а просто _указание_ вызвать родительский метод, если даже он предопределен в классе-потомке:
parent это ссылка именно на ОБЬЕКТ родителя, в следующем коде ф-я changeProperty() не статическая. Она может состояние обьекта (и родителя и потомка).и откуда там должен взяться экземпляр родительского класса?
есть родительский класс, это не одно и то же что экземпляр класса (объект)
class A {
public $var = 'a';
function changeProperty() {
$this->var = 'b';
}
}
class B extends A {
function __construct() {
echo $this->var;
parent::changeProperty();
echo $this->var;
}
}
new B();
парент это указание, а не ссылка на объект. "Объекта родителя" не существует.parent это ссылка именно на ОБЬЕКТ родителя
Хм... Похоже Вы правы, через parent:: можно вызывать не статические методы родителя, но при этом если в них использовать $this, то ссылаться он будет на обьект-потомок.парент это указание, а не ссылка на объект. "Объекта родителя" не существует.
class A {
public $var = 'parent property';
function printProperty() {
echo 'Print in parent: '.$this->var;
}
}
class B extends A {
public $var = 'child property';
function printProperty() {
echo 'Print in child: '.$this->var;
}
function __construct() {
parent::printProperty();
}
}
new B();