php中变量引用&不可与global共同使用

  问题来源,新公司debug。

  程序中代码大致如下

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中使用如下代码

<?php
    $CI =& get_instance();

    function demo()
    {
         global $CI;
         //return $CI->mehton;          //notice
         //return $CI->class->method;//500
    }

  服务器直接报了500。通过我第一部分的代码与注释,应该可以得出以下结论:在function的scope中global $ref是拿不到该引用的,php手册中也有说明,详情请看。干啥都不能不细心啊,好好学习基础^_^

时间: 2024-12-26 21:06:50

php中变量引用&不可与global共同使用的相关文章

【PHP】 foreach循环中变量引用的一道面试题

$a = array('a','b','c'); foreach($a as &$v){} foreach($a as $v){ } var_dump($a); 现在.不要打开浏览器,猜测一下.输出的结果是什么? 对引用比较了解的童鞋可能已经看出来了.正确答案是: array(3) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> &string(1) "b"}  也

php中引用&amp;的真正理解-变量引用、函数引用、对象引用

php的引用(就是在变量或者函数.对象等前面加上&符号) //最重要就是 删除引用的变量 ,只是引用的变量访问不了,但是内容并没有销毁 在PHP 中引用的意思是:不同的名字访问同一个变量内容. 变量的引用        PHP 的引用允许你用两个变量来指向同一个内容 <?php $a="ABC"; $b =&$a; echo $a;//这里输出:ABC echo $b;//这里输出:ABC $b="EFG"; echo $a;//这里$a的值变

JavaScript中var变量引用function与直接声明function

今天在h5开发app的过程中遇到了一个js问题,function的执行问题 在js中声明函数function有这两种方法 var A=function(){...} 或者 function A(){...} 第一种称之为变量引用函数,因为js允许函数作为一个值传递给变量,第二种是直接声明式函数 一直以为这两种没什么区别,然而,今天在使用过程中发现,当我使用第一种方式声明function的时候,如果如下这样: document.getElementById("xx").addEventL

[DB][mybatis]MyBatis mapper文件中的变量引用方式#{}与${}的差别

MyBatis mapper文件中的变量引用方式#{}与${}的差别 默认情况下,使用#{}语法,MyBatis会产生PreparedStatement语句中,并且安全的设置PreparedStatement参数,这个过程中MyBatis会进行必要的安全检查和转义. 示例1: 执行SQL:Select * from emp where name = #{employeeName} 参数:employeeName=>Smith 解析后执行的SQL:Select * from emp where n

shell中变量被定义为星号(*)后无法引用的问题

在编写shell脚本的过程中,有的时候难免会用到一些变量值被定义为(*)的变量,但是当我们试图引用这个变量的时候bash有默认会把(*)替换成当前目录下的所有文件名的列表,如下: [[email protected]_102 ~]# a=* [[email protected]_102 ~]# echo $a anaconda-ks.cfg install.log install.log.syslog [[email protected]_102 ~]# ls  anaconda-ks.cfg 

python main函数中变量默认为global variable

在python的main函数中的变量默认为全局变量,而其他的def函数中的变量则默认为局部变量. 当然,局部变量会优先于全局变量,在执行formal_print(t_global)语句时便可看出. 测试代码如下: <span style="font-size:18px;">#coding=utf-8 #测试python的全局变量,局部变量的机制 def formal_print(s_global):#常规的传参用法,传递参数进行print,变量名可任意 print &quo

内部类访问外部类的变量必须是final吗,java静态方法中不能引用非静态变量,静态方法中不能创建内部类的实例

内部类访问外部类的变量必须是final吗? 如下:class A{int i = 3;public void shout(){ class B{public void shout1(){System.out.println(i);} }B b=new B();b.shout1();} public static void main(String [] args){A a=new A();a.shout();} }可正常输出3,证明可以访问类的变量i,但改为下面的方式:class A{public

在mac下idea的常用快捷键如下,下面的快捷键都亲自试用,并有一些和eclipse对比的说明 alt+f7查找在哪里使用 相当于eclipse的ctrl+shift+G command+alt+f7 这个是查找选中的字符在工程中出现的地方,可以不是方法变量类等,这个和上面的有区别的 command+F7可以查询当前元素在当前文件中的引用,然后按F3可以选择 ,功能基本同上 选中文本,按com

在mac下idea的常用快捷键如下,下面的快捷键都亲自试用,并有一些和eclipse对比的说明 alt+f7查找在哪里使用 相当于eclipse的ctrl+shift+G command+alt+f7 这个是查找选中的字符在工程中出现的地方,可以不是方法变量类等,这个和上面的有区别的 command+F7可以查询当前元素在当前文件中的引用,然后按F3可以选择 ,功能基本同上 选中文本,按command+shift+F7 ,高亮显示所有该文本,按Esc高亮消失.选中文本,按Alt+F3 ,逐个往下

MyBatis mapper文件中的变量引用方式#{}与${}的差别

MyBatis mapper文件中的变量引用方式#{}与${}的差别 默认情况下,使用#{}语法,MyBatis会产生PreparedStatement语句中,并且安全的设置PreparedStatement参数,这个过程中MyBatis会进行必要的安全检查和转义.示例1:执行SQL:Select * from emp where name = #{employeeName}参数:employeeName=>Smith解析后执行的SQL:Select * from emp where name