PHP-我可以将函数名作为函数参数传递吗?

PHP-我可以将函数名作为函数参数传递吗?,php,Php,我有两个类,用于访问数据库中的两个不同表。它们都有一个类似的构造函数,如下所示: function __construct($db) { $this->db = $db; $userDAO = DAO_DBrecord::createUserDAO($this->db); $this->userDAO = $userDAO; } 另一个类具有相同的构造函数,只是它使用了createOtherTableDAO($this->db) 我正计划创建另外两个这

我有两个类,用于访问数据库中的两个不同表。它们都有一个类似的构造函数,如下所示:

function __construct($db) {
    $this->db = $db;
    $userDAO = DAO_DBrecord::createUserDAO($this->db);
    $this->userDAO = $userDAO;
}
另一个类具有相同的构造函数,只是它使用了
createOtherTableDAO($this->db)

我正计划创建另外两个这样的类,如果我能让它们都继承同一个构造函数,并将
createpropertabledao
作为参数传递,那会很方便

为了澄清,在上面的第一种情况下,
createUserDAO($this->db)
是一个静态函数,在我的DAO类中调用构造函数。DAO中的函数如下所示:

public static function createUserDAO($db) {
    return new DAO_DBrecord($db, 'users');
}
我使用此方法确保
user
模型只能调用
users
表上的DAO


我是个初学者,我想我从来没有见过像我想要的那样的东西。

将代码移动到工厂中创建DAO,然后注入DAO,而不是将它们硬耦合到这些类应该表示的任何类中。或者更确切地说,在工厂中作为一个整体创建各种表数据网关(“我用来访问两个不同表的类”),例如

class TableDataGatewayFactory
…
    public function create($gatewayName)
    {
        switch ($gatewayName) {
            case 'user':
                return new TableDataGateway(new UserDao($this->db)));
                break;
            default:
                throw new Exception('No Gateway for $gatewayName');
        }
    }
}
对于$this->db,可以通过ctor将其传递到工厂中,也可以将创建内容移动到工厂中。它的责任有点加倍,但考虑到这个工厂围绕着创建与数据库相关的协作者图,这是可以容忍的

除此之外:是的,
call\u user\u func(数组('ClassName','methodName'))
可以工作。有关详细信息,请参阅手册


将创建DAO的代码移动到工厂中,然后注入DAO,而不是将它们硬耦合到这些类应该表示的任何类中。或者更确切地说,在工厂中作为一个整体创建各种表数据网关(“我用来访问两个不同表的类”),例如

class TableDataGatewayFactory
…
    public function create($gatewayName)
    {
        switch ($gatewayName) {
            case 'user':
                return new TableDataGateway(new UserDao($this->db)));
                break;
            default:
                throw new Exception('No Gateway for $gatewayName');
        }
    }
}
对于$this->db,可以通过ctor将其传递到工厂中,也可以将创建内容移动到工厂中。它的责任有点加倍,但考虑到这个工厂围绕着创建与数据库相关的协作者图,这是可以容忍的

除此之外:是的,
call\u user\u func(数组('ClassName','methodName'))
可以工作。有关详细信息,请参阅手册


您可以通过以下方式实现此行为:

  • 任何文字

您可以通过以下方式实现此行为:

  • 任何文字

首先回答您的问题:不,您不能(不使用代码)将函数名作为参数传递。 但是:您想要归档的是使用继承的面向对象方法的海报子问题

您需要一个基类:

class BaseClass
{    
    function __construct($db) {
        $this->db = db;
    }    
}
以及您的实现:

class MyClass extends BaseClass
{
    function __construct($db) {
        parent::__contruct($db);
        $this->userDAO = DAO_DBrecord::createUserDAO($this->db);
    }
}
只是为了记录在案:邪恶的代码应该是 a) 您可以将函数封装在一个可以用作参数的
create\u函数中。
b) 您可以将函数名作为字符串传递给函数,然后将其传递给接收函数中的
eval

call_user_func($function,$args);
但请记住:当eval或create_函数看起来像答案时,您可能问错了问题


请参阅:

首先回答您的问题:不,您不能(不使用代码)将函数名作为参数传递。 但是:您想要归档的是使用继承的面向对象方法的海报子问题

您需要一个基类:

class BaseClass
{    
    function __construct($db) {
        $this->db = db;
    }    
}
以及您的实现:

class MyClass extends BaseClass
{
    function __construct($db) {
        parent::__contruct($db);
        $this->userDAO = DAO_DBrecord::createUserDAO($this->db);
    }
}
只是为了记录在案:邪恶的代码应该是 a) 您可以将函数封装在一个可以用作参数的
create\u函数中。
b) 您可以将函数名作为字符串传递给函数,然后将其传递给接收函数中的
eval

call_user_func($function,$args);
但请记住:当eval或create_函数看起来像答案时,您可能问错了问题


请参阅:

如果您觉得有必要将函数名或函数本身作为函数的参数传递,可以使用几种方法

call_user_func($function,$args);
是Php的本机函数之一,用于调用采用函数名和可选参数的方法或函数

call_user_func(当不属于对象方法时)的功能可以在不使用call_user_func的情况下复制,而使用函数名为字符串文字的变量。例如:

function some_func()
{
  echo "I'm a function!";
}

$function = "some_func";
$function();    /*Output: I'm a function!*/
$function = function()
{
    echo "I'm another function!";
}

$function();    /*Output: I'm another function*/
如果你有冒险精神,你可以更进一步,传递一个闭包/匿名函数,而不是函数名。例如:

function some_func()
{
  echo "I'm a function!";
}

$function = "some_func";
$function();    /*Output: I'm a function!*/
$function = function()
{
    echo "I'm another function!";
}

$function();    /*Output: I'm another function*/

如果您觉得有必要将函数名或函数本身作为函数的参数传递,可以使用几种方法

call_user_func($function,$args);
是Php的本机函数之一,用于调用采用函数名和可选参数的方法或函数

call_user_func(当不属于对象方法时)的功能可以在不使用call_user_func的情况下复制,而使用函数名为字符串文字的变量。例如:

function some_func()
{
  echo "I'm a function!";
}

$function = "some_func";
$function();    /*Output: I'm a function!*/
$function = function()
{
    echo "I'm another function!";
}

$function();    /*Output: I'm another function*/
如果你有冒险精神,你可以更进一步,传递一个闭包/匿名函数,而不是函数名。例如:

function some_func()
{
  echo "I'm a function!";
}

$function = "some_func";
$function();    /*Output: I'm a function!*/
$function = function()
{
    echo "I'm another function!";
}

$function();    /*Output: I'm another function*/

@JDelage:退房。还有一个PHP示例。为什么不简单地在父类中放置一个switch语句?@JDelage,因为创建应该与协作者分开。它提高了耦合性和内聚性。请参阅@JDelage:签出。还有一个PHP示例。为什么不简单地在父类中放置一个switch语句?@JDelage,因为创建应该与协作者分开。它提高了耦合性和内聚性。请参阅将字符串作为函数名传递时不需要使用eval。为什么不在父类构造函数中简单地放置一个
开关
,然后传递一个字符串来决定使用哪个dao?这会违反“开放-封闭原则”吗?而且,我也不清楚