在PHP中从特征访问私有类方法

时间:2019-05-29 20:35:31

标签: php class scope traits private-methods

我想从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 :(得分:0)

问题似乎是您的全局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]));
    }
}

如果您想使用public函数,则可以像这样将可选参数传递给它:

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)