문제

나는 현재 이런 식으로하고 있지만 올바른 방법이 아닌 것 같습니다.

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");
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top