php 中 a标签传递参数,php变量及参数传递

本文详细探讨了PHP中的zval容器、符号表、引用计数(refcount)、复制-on-write(cow)机制以及引用分离的概念。通过实例展示了值传递和引用传递的区别,特别是在闭包和函数参数传递中的应用。文章还提到了在Swoole环境下参数传递的特性,揭示了多进程环境下对象复制的影响。
摘要由CSDN通过智能技术生成

术语

zval容器,符号表,is_ref,refcount,cow,引用分离

# 值传递

$a =1; // 一个zval容器

$b=$a; // 两个zval容器,由于cow优化,仍然是一个zval容器

?>

# cow

$a = 1;

$b =$a; // cow优化,一个容器

$b=2; // 写操作,分离成两个zval容器了

?>

# 闭包use值传递

$var = 'Hello World';

$func=function ()use($var) { // 闭包use,值传递(copy)

var_dump($var); // Hello World

$var = "new value"; // 闭包内的值修改,不影响闭包外部的变量

};

$func();

var_dump($var); // 不变,仍然是Hello World

?>

# 闭包use通过引用改变外部变量

$var = 'Hello World';

$func=function ()use(&$var) { // 闭包use,试试传引用

var_dump($var); // Hello World

$var = new stdClass();

};

$func();

var_dump($var); // 引用发生了作用,输出object(stdClass)#2 (0) {}

?>

# 函数传递默认是值传递,对于对象则使用引用传递

$a = new stdClass();

function test($a) {

$a->b=1;

var_dump($a);

}

test($a);

var_dump($a); // $a被改变了,输出:object(stdClass)#1 (1) {["b"]=>int(1) }

?>

# swoole下的参数传递

class Pool {

private $_pool;

public function __construct()

{

$this->_pool = new SplQueue();

$this->_init();

}

private function _init(){

for($i=0;$i<100;$i++) {

$this->put($i);

}

}

public function get() {

return $this->_pool->dequeue();

}

public function put($item){

$this->_pool->enqueue($item);

}

public function length(){

return $this->_pool->count();

}

}

$pool = new Pool();

class Server {

private $_server;

private $_pool;

public function __construct(Pool $_pool)

{

$this->_pool = $_pool;

$this->_server = new Swoole\Http\Server("0.0.0.0", 9500);

$this->_server->set(

[

'worker_num' => 2,

// 'daemonize' => true, // daemon

'log_level' => SWOOLE_LOG_INFO,

]

);

$this->_server->on("request", [$this, "onRequest"]);

$this->_server->start();

}

public function onRequest(\Swoole\Http\Request $request, \Swoole\Http\Response $response)

{

echo $this->_pool->get().PHP_EOL;

}

}

$server = new Server($pool);

# 压测 ab -c 4 -n 4 http://127.0.0.1:9500/

# 输出:

#0

#1

#0

#1

# 分析:2个worker,4个并发,共4个请求,由于进程隔离,$pool对象发生了复制,而不是期望中输出0/1/2/3

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值