Мое тестирование выработало те же результаты, что и Prine, однако я подумал об довольно простом обходном пути:
Используя BufferedReader#nextLine()
, где вы Scanner#readLine()
, избегаете этой ошибки. Возможно, вы даже можете написать свою собственную оболочку сканера, чтобы переопределить функцию readLine Scanner с помощью функции nextLine BufferedReader.
Я думаю, что нашел решение:
class Parent extends Observer
{
function createChild()
{
$this->callme(); // this is OK
return new Child (function() { $this->callme(); });
}
}
class Child
{
private $gatewayFunction;
public function __constructor (Closure $gatewayFunction)
{
$this->gatewayFunction = $gatewayFunction;
}
public function __destroy()
{
$this->gatewayFunction->__invoke();
}
}
Кто собирается себя дергать? :)
Мой комментарий к вашему вопросу объясняет, почему он не работает. Этот ответ показывает способ выполнить то, что вы просили, основываясь на вашем разъяснении, что MyChild
не должен распространяться MyParent
.
Это пример взлома, который заставляет его работать, используя тот факт, что php не если вы вызываете защищенные методы в других случаях, чем вы, если вы разделяете предок защищенного метода.
Мне пришлось изменить код, чтобы сделать его действительным php. __constructor
не является именем конструктора php.
hacky.php
<?php
class Observer
{
protected function callme()
{
echo 'I was called from ' . get_called_class(), PHP_EOL;
}
}
class MyParent extends Observer
{
public function createMyChild()
{
$this->callme(); // this is OK
return new MyChild ($this);
}
}
class MyChild extends Observer // hackey extends
{
private $myMyParent;
public function __construct($myMyParent)
{
$this->myMyParent = $myMyParent;
$this->myMyParent->callme();
}
}
$p = new MyParent;
$c = $p->createMyChild();
Результат:
$ php hacky.php
I was called from MyParent
I was called from MyParent
protected
означает, что вы можете вызывать этот метод только из того же класса и из подклассов. То, что вы хотите сделать, невозможно. Ключевое слово protected
было бы бессмысленным, если бы вы могли называть эти методы повсюду.
В C ++ ключевое слово friend
для достижения желаемого: есть имя Child как friend
Observer ( это должно быть сделано изнутри Observer), а затем вы можете вызывать все методы в Observer (включая частные и защищенные) из методов Child. Но для PHP такого ключевого слова не существует.
Проблема заключается в том, что защищенный метод доступен только из одного класса или класса. Что вы можете сделать, так это расширить свой класс Child от родителя, например:
class Child extends Parent
{
public function __constructor ()
{
parent::__constructor();
}
public function __destroy()
{
$this->callme(); // Should work!
}
}
Или просто изменить метод на публичный.
И, btw, это код какого-то реального кода, который вы будете использовать? Этот конструктор, получающий родительский объект, кажется настолько неправильным. Что вы пытаетесь выполнить?