получить доступ к приватному методу класса из PHP - PullRequest
1 голос
/ 29 мая 2019

Я хочу вызвать метод частного класса из trait.Если я сделаю $this->privateMethod();, вызов будет сделан.

Поскольку я хочу вызывать этот метод, только если он существует, я реализовал функцию isCallable();но эта функция возвращает false, когда я ожидал true.

Я что-то упускаю из области видимости, почему это происходит и как я могу получить is_callable(), чтобы вернуть true?

См. Пример кода:

<?php

function isCallable($obj, $method)
{
    //$test1 = method_exists($obj, $method);
    //var_dump($test1);
    //TRUE

    //$test2 = is_callable([$obj, $method]);
    //var_dump($test2);
    //FALSE

    return (method_exists($obj, $method) && is_callable([$obj, $method]));
}

trait helper
{
    public function show()
    {
        echo "show!";

        if(isCallable($this, "afterShow"))
        {
            $this->afterShow();
        }

        //$this->afterShow();

    }
}

class my_class
{
    use helper;

    private function afterShow()
    {
        echo "...then this.";
    }
}

$objMyClass = new my_class();

$objMyClass->show();

1 Ответ

0 голосов
/ 30 мая 2019

Кажется, проблема в том, что ваша глобальная функция isCallable иногда захочет вернуть false для частного метода, но в этом случае true.У него нет контекста, который находится в области видимости объекта.

Один из обходных путей - использовать метод isCallable в вашей черте:

trait helper
{
    public function show()
    {
        echo "show!";

        if($this->isCallable($this, "afterShow"))
        {
            $this->afterShow();
        }

    }
    private function isCallable($obj, $method)
    {
        return (method_exists($obj, $method) && is_callable([$obj, $method]));
    }
}

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

function isCallable($obj, $method, $syntax_only = false)
{
    $test1 = method_exists($obj, $method);
    var_dump($test1);
    //TRUE

    $test2 = is_callable([$obj, $method], $syntax_only);
    var_dump($test2);
    //FALSE

    return (method_exists($obj, $method) && is_callable([$obj, $method], $syntax_only));
}

, а затем измените свой вызов на isCallable($this, "afterShow", true)

...