Логика parent::

vovchik542

Новичок
Не логичнее было бы ввести конструкцию $parent вместо parent:: по аналогии с $this, ведь мы обращаемся к свойствам и методам ОБЬЕКТА, пусть и в контексте класса-предка.
 

tz-lom

Продвинутый новичок
$this это переменная , которую можно куда нибудь присвоить итд , parent это не переменная

и еще вопросик, почему статические методы можно вызывать через обьект, а свойства нет?
непонятно что хотите,честно говоря не придумал ситуации похожей на ваше описание когда будет запрет на чтение,приведите пример когда нельзя,можно кодом
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
тоже обратная совместимость с 4кой - там не было жесткого разделения, можно было написать $this = 4; и объект превращался в int
 

fixxxer

К.О.
Партнер клуба
Код:
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)
о, до сих пор работает :D
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
а, так это только на уровне парсера закрыли, чтобы не было интересных багрепортов :)
 

Mols

Новичок
[offtop]
Я просто в офигении от любознательности некоторых людей)))
Мне бы наверное никогда не пришло в голову сделать
PHP:
$this = 4;
А уже это
PHP:
${"th"."is"} = 4;
... дык ваще.
[/offtop]

vovchik542. А смысл всех этих вопросов?
Есть ситнтаксис. Есть документация, что и как работает.
Чего ещё надо ?
 

vovchik542

Новичок
$this это переменная , которую можно куда нибудь присвоить итд , parent это не переменная
Я понимаю что $this это переменная. Ну и была бы себе переменная $parent, указывающая на экземпляр родительского класса, не вижу проблем...

непонятно что хотите,честно говоря не придумал ситуации похожей на ваше описание когда будет запрет на чтение,приведите пример когда нельзя,можно кодом
Я уже разобрался, сделано чтобы можно было динамически добавлять свойства в обьект. При этом оно создастся даже если существует статическое с таким же именем (хотя при определении класса сделать статическое и нестатическое с одинаковыми именами нельзя)
PHP:
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
 

vovchik542

Новичок
vovchik542. А смысл всех этих вопросов?
Есть ситнтаксис. Есть документация, что и как работает.
Чего ещё надо ?
Да просто из-за обратной совместимости разработчики иногда добавляют костыли. Зачем для позднего динамического связывания вводить новое ключевое слово static. Можно было изменить поведение self (а если уж очень нужно вызвать метод/свойство родителя то можно имя соотв. класса написать)

В том то и дело что для того чтобы понять как оно работает нужно лезть в документацию, а не следовать логике.
 

AmdY

Пью пиво
Команда форума
$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();
 

vovchik542

Новичок
$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->bar()
parent (без доллара) это КЛАСС, а вызываем через эту конструкцию метод ОБЬЕКТА. Напр. parent::__construct(), какое отношение к КЛАССУ имеет конструктор? Он инициализирует конкретный ОБЬЕКТ. Чего вызывать нестатический метод в контексте класса?
 

AmdY

Пью пиво
Команда форума
переменная это уже инстанцированный объект у которого должен отработать конструктор, а затем деструктор. зачем объект, там где фактически нужен просто вызов метода а-ля статичсекий.
 

A1x

Новичок
была бы себе переменная $parent, указывающая на экземпляр родительского класса, не вижу проблем...
и откуда там должен взяться экземпляр родительского класса?
есть родительский класс, это не одно и то же что экземпляр класса (объект)

parent - это не объект. скорее статический метод
parent это не статический метод
 

Духовность™

Продвинутый новичок
И как раз здесь логичнее бы смотрелось $parent->bar()
$parent тут смотрелся бы не логичнее, ибо это не указатель, подобный $this, который можно return-ить и передавать как самодостаточный объект (т.е. как ссылку на объект), а просто _указание_ вызвать родительский метод, если даже он предопределен в классе-потомке:

PHP:
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());
 

vovchik542

Новичок
переменная это уже инстанцированный объект у которого должен отработать конструктор, а затем деструктор. зачем объект, там где фактически нужен просто вызов метода а-ля статичсекий.
$this это тоже еще не инстанцированный обьект когда к $this обращаться в конструкторе и не отработал ни он ни деструктор.

$parent тут смотрелся бы не логичнее, ибо это не указатель, подобный $this, который можно return-ить и передавать как самодостаточный объект (т.е. как ссылку на объект), а просто _указание_ вызвать родительский метод, если даже он предопределен в классе-потомке:
и откуда там должен взяться экземпляр родительского класса?
есть родительский класс, это не одно и то же что экземпляр класса (объект)
parent это ссылка именно на ОБЬЕКТ родителя, в следующем коде ф-я changeProperty() не статическая. Она может состояние обьекта (и родителя и потомка).
PHP:
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();
выводит ab
 

vovchik542

Новичок
парент это указание, а не ссылка на объект. "Объекта родителя" не существует.
Хм... Похоже Вы правы, через parent:: можно вызывать не статические методы родителя, но при этом если в них использовать $this, то ссылаться он будет на обьект-потомок.
PHP:
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();
Выведет Print in parent: child property

В таком случает я совсем запутался, используя parent:: методы вызываются родительские не статические, но обьекта-родителя не существует...
Если не ошибаюсь в Java подобный код вывел бы Print in parent: parent property
 
Сверху