<?php
// 实例1
class test{
    public function run($index)
    {
        echo 'start:'.$index."<br />";
        sleep(3);
        echo 'end:'.$index."<br />";
    }
}$test = new test();
$test->run(1);
$test->run(2);这个输出是
start:1
end:1
start:2
end:2怎么才能让他们输出
start:1
start:2
end:1
end:2求求你们帮帮忙 帮帮我解决一下

解决方案 »

  1.   

    php 有第三方提供的线程操作扩展
    线程在何时运行是由操作系统调度的,你不可能预知运行的顺序
      

  2.   

    多线程我并不了解,要实现你要求的效果有很多方法。
    1,利用__deconstruct()函数,在对象销毁时,依次执行任务。
    2,利用中间件原理。
    3,将任务存入存储介质,如文件,redis等,再开一个程序监听异步执行存储介质里的任务。
    这里我用前两种实现一下吧。interface Event{
    public function handle();
    }class Job implements Event{
    public $param;
    public function __construct($param){
    $this->param = $param;
    }
    public function handle(){
    echo 'end:'.$this->param."<br />";
    }
    }class Test{
    public static $jobs=[]; public  function run(Event $job){
    static::$jobs[] = $job;
    echo 'start:'.$job->param."<br />";
    } public function __destruct(){
    foreach (static::$jobs as $job) {
    $job->handle();
    }
    }}$test = new Test;$test->run( new Job(1) );
    $test->run( new Job(2) );interface Event{
    public function handle(Closure $next);
    }class Job implements Event{
    public $param;
    public function __construct($param){
    $this->param = $param;
    }
    public function handle(Closure $next){
    echo 'start:'.$this->param."<br />";
    $next();
    } public function boot(){
    echo 'end:'.$this->param."<br />";
    }
    }class Test{
    public $jobs=[]; public function __construct(array $arr){
    foreach ($arr as $v) {
    $this->jobs[] = new Job($v);
    }
    } public function run(){
    $pipes=array_reverse($this->jobs);
    $firstSlice=function(){
    foreach ($this->jobs as $job) {
    echo $job->boot();
    }
    }; call_user_func(
    array_reduce($pipes,$this->getSlice(),$firstSlice)
    );
    } function getSlice(){
    return function ($stack,$pipe){
    return function () use ($stack,$pipe){
    return $pipe->handle($stack);
    };
    };
    }}$arr = [1,2];
    $test = new Test($arr);
    $test->run( );
      

  3.   

    最简单的是下面这种,基本的面向对象:class Test{
    public static $jobs=[]; public  function add($index){
    static::$jobs[] = $index;
    echo 'start:'.$index."<br />";
    } public function run(){
    foreach (static::$jobs as $index) {
    echo 'end:'.$index."<br />";
    }
    }}$test = new Test;$test->add(1);
    $test->add(2);
    $test->run();