@Shimpanze

Реализую method chaining. Как сделать так, чтобы вызов метода влиял на общий результат?

Здравствуйте!

Активно осваиваю ООП.

$foo = new foo;
$foo->bar( 'abc' );


Есть ли возможность, внутри класса foo узнать, что в данном экземпляре, в текущий момент вызван метод bar()?

class foo {
    public function bar( $data ) {}

    private function baz() {
        if ( если вызван bar() ) {
            // сделать что-то
        }
    }
}
  • Вопрос задан
  • 297 просмотров
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега PHP
Учись задавать вопросы. То что ты сейчас понаписал - это называется проблема XY, бич всех новичков. (ну и конечно бич всех помогаек на тостере, которым некогда думать, им надо на вопрос отвечать).

Никогда не задавай вопрос, как починить тот кривой костыль, который ты себе по неграмотности придумал. Всегда задавай вопрос, как решить исходную задачу.

Потому что она решается элементарно. Надо просто понять, что просто "вызовами методов" ООП не ограничивается. иногда в методах даже пишут какой-то код. поэтому привязываться к факту вызова метода просто глупо. А информация между методами в классе передается с помощью переменных, то есть свойств класса

class foo {
    protected $bar;
    public function bar(string $data ) {
        $this->bar = $data; 
    }

    private function baz() {
        if (isset($this->bar)) {
            // сделать что-то
        }
    }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
sslion
@sslion
the difference between
__FUNCTION__ and __METHOD__ as in PHP 5.0.4 is that

__FUNCTION__ returns only the name of the function

while as __METHOD__ returns the name of the class alongwith the name of the function

class trick
{
      function doit()
      {
                echo __FUNCTION__;
      }
      function doitagain()
      {
                echo __METHOD__;
      }
}
$obj=new trick();
$obj->doit();
output will be ----  doit
$obj->doitagain();
output will be ----- trick::doitagain
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
https://www.php.net/manual/ru/function.debug-backt...
class Baz
{
    public function bar() {
        $this->foo();
    }
    
    public function foo() {
        $backtrace = debug_backtrace();
        $stack = array_map(
            function($el) {
                return "{$el['class']}{$el['type']}{$el['function']}";
            },
            $backtrace
        );
        var_dump($stack);
    }
}

$t = new Baz;
$t->bar();

/* array(2) {
  [0] => string(8) "Baz->foo"
  [1] => string(8) "Baz->bar"
} */

Но, по хорошему, поведение функции не должно зависеть от того, откуда она вызвана.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы