멤버 기능을 배열에 할당하고 호출하는 방법
-
09-09-2019 - |
문제
나는 현재 이런 식으로하고 있지만 올바른 방법이 아닌 것 같습니다.
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);
}
해결책
직업과 사용을위한 수업을 작성하십시오 공장 그것들을 만들기위한 패턴. 그런 다음 클래스 jobManager를 작성하여 목록 OB 작업 인스턴스를 유지해야합니다.
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();
}
}
}
다른 팁
이 작업을 수행하는 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'를 문자열 변수로 대체 할 수도 있습니다.
확인해주십시오 call_user_func () 또는 call_user_func_array ()
살펴보십시오 호출 가능 의사 유형. 그런 다음 해당 기능을 호출 할 수 있습니다 call_user_func ():
class Foo {
function bar($str) {
echo($str);
}
}
$foo = new Foo();
$func_array = array();
$func_array['foo->bar'] = array($foo, 'bar'); // this is the 'callable' pseudo-type
call_user_func($func_array['foo->bar'], "Hello 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");
}
이 문제에 대한 몇 가지 가능한 해결책이있을 수 있습니다. 당신은 다른 답변에 명령과 공장 패턴이 제시되어 있습니다. 이것은 사용 방법을 보여줍니다 방문객 + 명령 패턴 협력.
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();
산출:
Name washes dishes
Name does shopping
클래스 구현 IJob
인터페이스는 나중에 실행을 위해 전달되고 저장 될 수있는 명령입니다. 길 Name
객체는 컬렉션에서 작업을 호출합니다 (통과 $this
참조)은 방문자 패턴의 경우 일반적입니다 (이 방식으로 작업 객체는 호출자에 액세스 할 수 있습니다. Name
물체). 그러나 명시 적 방법을 재정의하는 데 대한 기본 지원이 부족하여 PHP에서는 실제 방문자 패턴이 불가능합니다.
이것이 올바른 방법인지 모르겠습니다. 그러나 이것은 내가 내 내 일입니다.
$this->api['google']['+1Button']=function($str)
{
echo $str;
};
$this->api['google']['+1Button']("hello world");