无法在Stackable上分配简单数组

时间:2015-01-07 15:19:28

标签: php arrays codeigniter pthreads

我正在尝试为使用pthread的codeigniter创建一个库,一切正常,但是当我想为数组赋值时,这不适用于传统的$ a ['key'] ='val'; < / p>

小测试例:(已更新)

class Test {
    protected $core;
    protected $stack;

    public function init(){
        $this->stack = new Test_Stack();
        $this->core = new Test_Core($this->stack);
    }

    public function do_test(){
        return $this->core->assign();
    }
}


class Test_Stack extends Stackable {
    protected $a;

    function __construct(){
        $this->a = array();
    }

    protected function test(){ // Call from other class extends Threads
        $this->a['key1'] = 'NOWORK';
        print_r($this->a); // THIS RETURN NOTHING   

        $this->a = array_merge($this->a, array('key1' => 'WORK'));
        print_r($this->a); // NOW THIS GOOD RETURN Key1..
    }

    public function run(){}
}

class Test_Core {
    protected $thread;
    protected $stack;

    function __construct($s){
       $this->stack = $s;
    }

    public function assign(){
        $this->thread = new Test_Thread($this->stack);
        $this->thread->start();

        $this->thread->join();
    }
}

class Test_Thread extends Thread{
    protected $stack;

    function __construct($s){
       $this->stack = $s;
    }

    public function run(){
        $this->stack->test();
    }
}

我在没有测试的情况下编写这个基本代码,但它与我的lib的结构相同,需要这个扩展test_stack并添加或更改测试函数的例子。

即使现在有效,我也明白为什么我不能正常分配我的阵列? 或者说,我做错了什么?

2 个答案:

答案 0 :(得分:0)

在我的工作:

class Stack  {
    protected $a;

    function __construct(){
        $this->a = array();
    }

    function test(){ 
         $this->a['key1'] = 'NOWORK';
         print_r($this->a); // THIS RETURN NOTHING


         $this->a = array_merge($this->a, array('key1' => 'WORK'));
         print_r($this->a); // NOW THIS GOOD RETURN Key1..
    }
}


$obj = new Stack();
$obj->test();

输出:

Array
(
    [key1] => NOWORK
)
Array
(
    [key1] => WORK
)

答案 1 :(得分:0)

OK数组不是线程安全的,应该可以堆叠使用,这样做诀窍:

Libraries / Test.php:

class Test {
    protected $core;
    protected $stack;

    public function init(){
        $this->stack = new Test_Stack();
        $this->core = new Test_Core($this->stack);
    }

    public function do_test(){
        $this->core->assign();
        $this->core->assign();
        $this->core->assign();
    }

    public function get_a(){
        return $this->core->get_a();
    }
}

class Test_Array_Stack extends Stackable {
    public function run(){}
}

class Test_Stack extends Stackable {
    protected function test($a){
        $a[] = 'WORK';
    }
    public function run(){}
}

class Test_Core {
    protected $thread;
    protected $stack;
    protected $a;

    function __construct($s){
       $this->stack = $s;

       $this->a = new Test_Array_Stack();
    }

    public function assign(){
        $this->thread = new Test_Thread($this->stack, $this->a);
        $this->thread->start();

        $this->thread->synchronized(function($thread){
            $thread->wait();
        }, $this->thread);

        return $this->a;
    }

    public function get_a(){
        return $this->a;
    }
}

class Test_Thread extends Thread{
    protected $stack;
    protected $a;

    function __construct($s, $a){
       $this->stack = $s;
       $this->a = $a;
    }

    public function run(){
        $this->stack->test($this->a);

        $this->synchronized(function($thread){
            $thread->notify();
        }, $this);
    }
}

你可以扩展Test_Stack以创建对我的项目更有用的lib扩展,就像在其他文件Test_Info.php上一样:

require_once APPPATH.'libraries/Test.php';

class Test_Info extends Test {

    function init(){
        $this->stack = new Test_Info_Stack();
        $this->core = new Test_Core($this->stack);
    }
}

class Test_Info_Stack extends Test_Stack {
    protected function test($a){
        parent::test($a);
        $a[] = 'INFO';
    }
}

在控制器上使用:

function index(){
    //without extension
    $this->load->library('Test');
    $this->test->init();
    $this->test->do_test();
    print_r($this->test->get_a());

    //with extension
    $this->load->library('Test_Info');
    $this->test_info->init();
    $this->test_info->do_test();
    print_r($this->test_info->get_a());
}

花了我一些时间,我希望它会帮助某人,LuckyBurger感谢你的解释链接。