php中变量引用&不可与global共同使用
问题来源,新公司debug。
程序中代码大致如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | class Ci { private static $instance = NULL; public $name = 'hello' ; public $load = null; public function __construct() { self:: $instance = & $this ; $this ->load = new Load; mlog(self:: $instance , __LINE__ ); //other code .... $this ->name = 'my name' ; } public static function &getInstance() { return self:: $instance ; } } class My extends Ci{ public function __construct() { parent::__construct(); $this ->model = new Model; } } class Model { public function __construct() { $this ->name = _get(); // null mlog( "success, and model->name = {$this->name}" , __LINE__ ); } } class Load { public $name = 'I am Load class' ; public function getName() { return $this ->name; } } $CI =& get_instance(); // mlog($CI->name); //hello // mlog($CI->load->getName()); //I am Load class mlog( $CI , __LINE__ ); $CI = new My; mlog( $CI , __LINE__ ); function _get() { //call static variables global $CI ; //non-boject //return $CI->load->name(); // 500 return $CI ->name; //notice } function &get_instance() { return Ci::getInstance(); } function mlog( $content , $line = __LINE__ , $display = true) { $next_line = "<br />" ; if (php_sapi_name() === 'cli' ) { $init = '' ; $next_line = "\n" ; } if ( $display ) { echo $init ; echo "in line: $line" . $next_line ; print_r( $content ); echo $next_line ; } } |
相信朋友们可以看出来,这是CI框架中的一部分,开发者为了封装方法所以在helper中使用如下代码
1 2 3 4 5 6 7 8 9 | <?php $CI =& get_instance(); function demo() { global $CI ; //return $CI->mehton; //notice //return $CI->class->method;//500 } |
服务器直接报了500。通过我第一部分的代码与注释,应该可以得出以下结论:在function的scope中global $ref是拿不到该引用的,php手册中也有说明,详情请看。干啥都不能不细心啊,好好学习基础^_^
分类:
PHP学习
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现