PHP: Можно ли назвать класс, который создал вас? - PullRequest
0 голосов
/ 17 июня 2009

У меня есть класс в php, который создает другой класс, и я хочу, чтобы этот дочерний класс мог вызывать родительский класс, но не передавая $ this в качестве аргумента дочернему классу. Я также не хочу делать родительский класс глобальным. Есть ли способ вызвать родительский класс, как-то как parent-> function или что-то подобное?

Ответы [ 5 ]

4 голосов
/ 17 июня 2009

Я думаю, что то, что вы называете родительско-дочерними отношениями, является просто композицией («родитель» содержит экземпляр несвязанного в классе иерархии «ребенка»). Если мое предположение верно, то это пахнет плохо, потому что два класса будут тесно связаны, и это указывает на плохой дизайн где-то («родитель», «ребенок» или оба).

Менее вонючие альтернативы:

  • Получить необходимые данные от «child» и вызвать метод у «parent» с этими данными
  • Передайте данные, которые «родитель» хранит, «потомку» и поместите туда метод, чтобы «потомок» мог вызвать его
  • Вызвать метод в «parent» и передать результат «child»
  • Используйте наследование, если оно имеет смысл, чтобы и «родитель», и «потомок» стали действительно родителем и потомком и у обоих был метод, тогда «родителю» не нужно было бы создавать «потомка», вы бы напрямую используйте ребенка в коде.
2 голосов
/ 17 июня 2009

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

<?php

    class B 
    {
        function B() {
            $trace = debug_backtrace();
            $trace[1]['object']->y();
        }
    }

    class A 
    {
        function x() {
            $z = new B;
        }
        function y() {
            printf("hi");
        }
    }

    $test = new A;
    $test->x();

?>
0 голосов
/ 17 июня 2009

Я не делаю достаточно PHP, чтобы знать, возможно ли это, но не могли бы вы передать делегат / обратный вызов в конструктор объекта? Таким образом, у вас не весь объект, а только ссылка на метод, который вы хотите вызвать!

НТН

ONESHOT

0 голосов
/ 17 июня 2009

(...), но не передавая $ this в качестве аргумента дочернему классу

небеса, ПОЧЕМУ? "Послушай, ма, я могу мочиться, не держа их руками. Ой, теперь это случилось снова. Отлично."

это может быть так просто, но я думаю, мы никогда не узнаем, почему это запрещено. Полагаю, вы просто не понимаете ООП (как подсказывает ваша путаница между иерархиями классов и экземпляров), и вам лень это изучать. Ceci n'est pas une pipe!

внешний вид:

<?php
    class AClass {
        public $parent = false;

        public function setParent($parent) {
            $this->parent = $parent;
        }

        public function createChild() {
            $newInstance = new AClass();
            $newInstance->setParent($this);
        }
    }
?>

Да, это так просто! теперь у вас есть родитель.

или это потому, что вам не разрешено изменять родительский класс?
есть секрет, но я скажу вам:

Кантрип 0-го уровня для злых колдунов: наследование , также известное как "class B extends A {}".

Я заранее прошу прощения за то, что был скупым, саркастическим, бесполезным ослом, но если бы я действительно стоял за извинениями, я бы не написал этот ответ.

НО Я обещаю поднять ваш вопрос (и извиниться честно), если вы можете дать нам вескую причину, по которой передача ссылки запрещена.

0 голосов
/ 17 июня 2009

Это что-то вроде взлома, но попробуйте проанализировать debug_backtrace()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...