PHP 静态函数作为依赖注入的参数
PHP static function as parameter with dependency injection
我想在 class B 中调用 class 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。
当我这样做时,出现错误,提示找不到 Class A。
这可能吗?这甚至被认为是好的做法吗?
我认为你的做法是错误的。事实上,您在此处使用的语法已在 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 函数直接调用它(这被认为是最好的实践)。请注意,我假设您的调用将始终是静态的,但它可以与您以这种方式传递的任何 class 一起使用。
您可以在此处查看实际效果 https://3v4l.org/WpeiD
我必须为函数调用提供完整的命名空间,所以:
$b->bar($test, ['my\namespace\A', 'foo']);
我想在 class B 中调用 class 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。
当我这样做时,出现错误,提示找不到 Class A。
这可能吗?这甚至被认为是好的做法吗?
我认为你的做法是错误的。事实上,您在此处使用的语法已在 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 函数直接调用它(这被认为是最好的实践)。请注意,我假设您的调用将始终是静态的,但它可以与您以这种方式传递的任何 class 一起使用。
您可以在此处查看实际效果 https://3v4l.org/WpeiD
我必须为函数调用提供完整的命名空间,所以:
$b->bar($test, ['my\namespace\A', 'foo']);