Как получить доступ к методу из свойства после изменения его видимости в классе экспонирования? [Дубликат]

Мое тестирование выработало те же результаты, что и Prine, однако я подумал об довольно простом обходном пути:

Используя BufferedReader#nextLine(), где вы Scanner#readLine(), избегаете этой ошибки. Возможно, вы даже можете написать свою собственную оболочку сканера, чтобы переопределить функцию readLine Scanner с помощью функции nextLine BufferedReader.

2
задан John Smith 11 September 2015 в 17:56
поделиться

4 ответа

Я думаю, что нашел решение:

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();
    }
}

Кто собирается себя дергать? :)

0
ответ дан John Smith 25 August 2018 в 18:57
поделиться

Мой комментарий к вашему вопросу объясняет, почему он не работает. Этот ответ показывает способ выполнить то, что вы просили, основываясь на вашем разъяснении, что 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
1
ответ дан Josh J 25 August 2018 в 18:57
поделиться

protected означает, что вы можете вызывать этот метод только из того же класса и из подклассов. То, что вы хотите сделать, невозможно. Ключевое слово protected было бы бессмысленным, если бы вы могли называть эти методы повсюду.

В C ++ ключевое слово friend для достижения желаемого: есть имя Child как friend Observer ( это должно быть сделано изнутри Observer), а затем вы можете вызывать все методы в Observer (включая частные и защищенные) из методов Child. Но для PHP такого ключевого слова не существует.

2
ответ дан Michael 25 August 2018 в 18:57
поделиться

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

class Child extends Parent
{
    public function __constructor ()
    {
        parent::__constructor();
    }

    public function __destroy()
    {
        $this->callme(); // Should work!
    }
}

Или просто изменить метод на публичный.

И, btw, это код какого-то реального кода, который вы будете использовать? Этот конструктор, получающий родительский объект, кажется настолько неправильным. Что вы пытаетесь выполнить?

2
ответ дан Yam Frich 25 August 2018 в 18:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: