Php 如何将成员函数分配给数组并调用它
我现在这样做,但似乎不是正确的方式:Php 如何将成员函数分配给数组并调用它,php,function-pointers,Php,Function Pointers,我现在这样做,但似乎不是正确的方式: class Name { protected $jobs2do; public function __construct($string) { $this->jobs2do[] = $this->do; } public function do() { ... } } 由于直接分配函数将导致警告,因此应执行以下操作: function func() { ...
class Name
{
protected $jobs2do;
public function __construct($string) {
$this->jobs2do[] = $this->do;
}
public function do() {
...
}
}
由于直接分配函数将导致警告,因此应执行以下操作:
function func()
{
...
}
$func_array[] = 'func';
比如说,把它放进一个字符串中,但当它是一个成员函数时,我不知道怎么做
以下版本可以吗
class Name
{
public $jobs2do;
public function __construct($string) {
$this->jobs2do[] = array($this,'do');
}
public function do() {
...
}
}
打电话时,只需:
$instance = new Name();
foreach ($instance->jobs2do as $job)
{
call_user_func($job);
}
看看伪类型。然后,您可以使用以下命令调用该函数:
编辑:似乎您正在尝试实现。在这种情况下,您可以尝试以下方法:
// define an interface for all actions
interface Executable {
public function do();
}
// an example action
class DoSomething implements Executable {
private $name;
public __construct($name) {
$this->name = $name;
}
public function do($str) {
echo("Hello $str, my name is $this->name");
}
}
$objects_to_process = array(new DoSomething("Foo"), new DoSomething("Bar"));
foreach ($objects_to_process as $obj) {
if ($obj instanceof Executable)
$obj->do("World");
}
看看伪类型。然后,您可以使用以下命令调用该函数:
编辑:似乎您正在尝试实现。在这种情况下,您可以尝试以下方法:
// define an interface for all actions
interface Executable {
public function do();
}
// an example action
class DoSomething implements Executable {
private $name;
public __construct($name) {
$this->name = $name;
}
public function do($str) {
echo("Hello $str, my name is $this->name");
}
}
$objects_to_process = array(new DoSomething("Foo"), new DoSomething("Bar"));
foreach ($objects_to_process as $obj) {
if ($obj instanceof Executable)
$obj->do("World");
}
请检查或请检查或为作业编写一个类,并使用模式创建它们。然后编写一个类JobManager,它应该维护一个作业实例列表
interface iCallableJob
{
public function run();
}
class Job implements iCallableJob
{
// The parameterized factory method
public static function factory($type)
{
$classname = 'Job_' . $type;
if (class_exists($classname) && in_array('iCallableJob', class_implements('Job')))
{
return new $classname();
}
return null;
}
public function run() { return null; }
}
class Job_type1 extends Job
{
public function run()
{
echo 'Job 1';
}
}
class JobManager
{
protected $jobs2do = array();
public function addJob($type)
{
if ($job = Job::factory($type))
{
$this->jobs2do[] = $job;
return $job;
}
return null;
}
public function runAll()
{
foreach ($this->jobs2do AS $job)
{
$job->run();
}
}
}
为Job编写一个类,并使用模式创建它们。然后编写一个类JobManager,它应该维护一个作业实例列表
interface iCallableJob
{
public function run();
}
class Job implements iCallableJob
{
// The parameterized factory method
public static function factory($type)
{
$classname = 'Job_' . $type;
if (class_exists($classname) && in_array('iCallableJob', class_implements('Job')))
{
return new $classname();
}
return null;
}
public function run() { return null; }
}
class Job_type1 extends Job
{
public function run()
{
echo 'Job 1';
}
}
class JobManager
{
protected $jobs2do = array();
public function addJob($type)
{
if ($job = Job::factory($type))
{
$this->jobs2do[] = $job;
return $job;
}
return null;
}
public function runAll()
{
foreach ($this->jobs2do AS $job)
{
$job->run();
}
}
}
这个问题有几种可能的解决方案。在其他回复中显示了命令和工厂模式。这一个演示了如何使用+模式协作
class Name {
protected $jobs = array();
public function addJob(IJob $j) {
$this->jobs[] = $j;
}
public function do() {
foreach ($this->jobs as $j) {
$j->run($this);
}
}
}
interface IJob {
public function run(Name $invoker);
}
class WashDishes implements IJob {
public function run(Name $invoker) {
echo get_class($invoker) . ' washes dishes<br/>';
}
}
class DoShopping implements IJob {
public function run(Name $invoker) {
echo get_class($invoker) . ' does shopping<br/>';
}
}
$n = new Name();
$n->addJob(new WashDishes());
$n->addJob(new DoShopping());
$n->do();
实现
IJob
接口的类是一个可以传递和存储以供以后执行的命令。Name
对象调用集合中的作业的方式(传递$this
引用)是访问者模式的典型方式(作业对象访问其调用者的方式-Name
对象)。然而,真正的访问者模式在PHP中是不可能的,因为缺乏对显式方法重写的本机支持。对于这个问题,有几种可能的解决方案。在其他回复中显示了命令和工厂模式。这一个演示了如何使用+模式协作
class Name {
protected $jobs = array();
public function addJob(IJob $j) {
$this->jobs[] = $j;
}
public function do() {
foreach ($this->jobs as $j) {
$j->run($this);
}
}
}
interface IJob {
public function run(Name $invoker);
}
class WashDishes implements IJob {
public function run(Name $invoker) {
echo get_class($invoker) . ' washes dishes<br/>';
}
}
class DoShopping implements IJob {
public function run(Name $invoker) {
echo get_class($invoker) . ' does shopping<br/>';
}
}
$n = new Name();
$n->addJob(new WashDishes());
$n->addJob(new DoShopping());
$n->do();
实现IJob
接口的类是一个可以传递和存储以供以后执行的命令。Name
对象调用集合中的作业的方式(传递$this
引用)是访问者模式的典型方式(作业对象访问其调用者的方式-Name
对象)。然而,真正的访问者模式在PHP中是不可能的,因为缺乏对显式方法重写的本机支持。有(至少)4种方法可以做到这一点。还有其他方法,但这些是最纯粹的。方法版本至少需要PHP5
class foo {
public function bar($a) { return $a; }
}
$anObject = new foo();
$ret = call_user_func(array($anObject,'bar'), 1);
$ret = call_user_func_array(array($anObject,'bar'), array(1));
$ret = call_user_method('bar', $anObject, array(1));
$ret = call_user_method_array('bar', $anObjectm, 1);
您也可以用字符串变量替换“bar”。有(至少)4种方法。还有其他方法,但这些是最纯粹的。方法版本至少需要PHP5
class foo {
public function bar($a) { return $a; }
}
$anObject = new foo();
$ret = call_user_func(array($anObject,'bar'), 1);
$ret = call_user_func_array(array($anObject,'bar'), array(1));
$ret = call_user_method('bar', $anObject, array(1));
$ret = call_user_method_array('bar', $anObjectm, 1);
也可以用字符串变量替换“bar”。不知道这是否正确。但我就是这样做的
$this->api['google']['+1Button']=function($str)
{
echo $str;
};
$this->api['google']['+1Button']("hello world");
不知道这是不是正确的方法。但我就是这样做的
$this->api['google']['+1Button']=function($str)
{
echo $str;
};
$this->api['google']['+1Button']("hello world");
但我不会调用用户函数,而是一个成员函数:(没关系。看看我的小例子。谢谢,我更新了我的帖子,你能告诉我在构造函数中是否正确吗?哦,看起来你使用了多个实例,这与我的设计不同:(好的,我明白了。很公平。是的,我认为你的代码看起来很好。但我不会调用用户函数,而是一个成员函数:(没关系。看看我的小例子。谢谢,我更新了我的帖子,你能告诉我在构造函数中是否正确吗?哦,似乎你使用了多个实例,这与我的设计不同:(好的,我明白了。很公平。是的,我认为你的代码看起来不错。