我想从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();
答案 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)