我想在类B中调用类A的静态函数,方法是将它作为参数传递给Start.php,但不要将ClassA.php包含到ClassB.php中。
我想要这样做的原因是因为我有一些特定于客户端的逻辑,我想分开并集中调用,只有当我真正需要它时(index.php)而不将其包含在其他文件中。
假设我有3个文件。
Start.php, ClassA.php, ClassB.php
ClassA.php
class A {
public static function foo($param) {
// do some special logic
// and return either true or false
}
}
ClassB.php
class B {
function bar($var, $func) {
foreach($var as $v) {
if($func($var)) {
echo 'OK';
}
}
}
}
Start.php
require_once('ClassA.php');
require_once('ClassB.php');
class Start() {
function init() {
$b = new B();
$test = array(1,2,3,4,5);
$b->bar($test, ['A', 'foo']);
}
}
Start::init();
所以,Start取决于ClassA和ClassB,没关系。
但我不希望ClassB依赖于ClassA。
当我这样做时,我收到错误,说无法找到A类。
这可能吗?这甚至被视为良好做法吗?
答案 0 :(得分:0)
我认为你以错误的方式解决这个问题。实际上,您在此处使用的语法已在PHP7中进行了更改。让我们清理一下
class B {
function bar($var, $func) {
$method = $func[0] . '::' . $func[1];
foreach($var as $v) {
if(call_user_func($method, $v)) {
echo 'OK';
}
}
}
}
所以我们在这里做的是告诉PHP使用数组中的静态函数,然后使用精确的call_user_func函数直接调用它(这被认为是最佳实践) 。请注意,我认为您的通话始终是静态的,但它适用于您以这种方式通过的任何课程。
中查看此操作答案 1 :(得分:0)
我必须为函数调用提供完整的命名空间,所以:
$b->bar($test, ['my\\namespace\\A', 'foo']);