标签:
新的项目用的是 laravel ,所以我终于开始愉快的学习世界上最好的语言了。
学习使我快乐,我爱学习 :)(我就用这句话表达,接触了两天的我对它的态度,ps:我始终相信 Javascript 终将统治世界!)
这篇文章主要说明两个问题:
1、php 引用问题 (&);
2、php 对象继承问题。
首先,php 引用 :
在变量或者函数、对象等前面加上 & 符号,不同的名字访问同一个变量内容。
1 <? 2 $a="ABC"; 3 $b =&$a; 4 echo $a;//这里输出:ABC 5 echo $b;//这里输出:ABC 6 $b="EFG"; 7 echo $a;//这里$a的值变为EFG 所以输出EFG 8 echo $b;//这里输出EFG 9 ?>
第 3 行 $b 引用了 $a ,这个的意思是说,$b 与 $a 共同指向同一个变量(两个变量指向同一个内容),$b 拥有 $a 的值,同时 可以通过改变 $b 来改变 $a 的值,这也就是 7 、8 行输出 EFG 的原因。
再看一个例子,嗯,看例子也使我快乐:)
1 <?php 2 function &test() 3 { 4 static $b=0;//申明一个静态变量 5 $b=$b+1; 6 echo $b; 7 return $b; 8 } 9 10 $a=test();//这条语句会输出 $b的值 为1 11 $a=5; 12 $a=test();//这条语句会输出 $b的值 为2 13 14 $a=&test();//这条语句会输出 $b的值 为3 15 $a=5; 16 $a=test();//这条语句会输出 $b的值 为6 17 ?>
第 10 行,$a 调用 test 方法,因为没有加 & ,也就是不是引用,所以只是返回函数值,赋值给 $a ,输出 1 。
第 12 行,虽然 $a 在第 11 行,被赋值为 5 ,但由于仍然不是引用,所以没有能力改变 test 方法中的 $b 的值,调用的时候也只能 返回本来的函数值,由于在第 10 行的时候 $b 已经等于 1 了,所以再次调用 输出值为 2。
第 14 、 15 行 通过 $a = &test() 方式调用函数 , 它的作用是 将 return $b 中的 $b 变量的内存地址与 $a 变量的内存地址指向了同一个地方。这个时候改变 $a 的值,同时也会改变 $b 的值。于是第 16 行会输出 6。
第二个问题 php 对象继承问题:
1 /** 2 * Define MyClass 3 */ 4 class MyClass 5 { 6 // 声明一个公有的构造函数 7 public function __construct() { } 8 9 // 声明一个公有的方法 10 public function MyPublic() { } 11 12 // 声明一个受保护的方法 13 protected function MyProtected() { } 14 15 // 声明一个私有的方法 16 private function MyPrivate() { } 17 18 // 此方法为公有 19 function Foo() 20 { 21 $this->MyPublic(); 22 $this->MyProtected(); 23 $this->MyPrivate(); 24 } 25 } 26 27 $myclass = new MyClass; 28 $myclass->MyPublic(); // 这行能被正常执行,可以直接调用其 公有 的方法 29 $myclass->MyProtected(); // 这行会产生一个致命错误,不可以直接调用其 受保护的 方法 30 $myclass->MyPrivate(); // 这行会产生一个致命错误,不可以直接调用其 私有 的方法 31 $myclass->Foo(); // 公有,受保护,私有都可以执行,可以通过一个公有的方法,间接调用私有和受保护的方法
如果现在 我们定义一个新的类 MyClass 2,它继承了上面的 MyClass ,再调用公有和私有的方法 会怎么样呢?
1 /** 2 * Define MyClass2 3 */ 4 class MyClass2 extends MyClass 5 { 6 // 此方法为公有 7 function Foo2() 8 { 9 $this->MyPublic(); 10 $this->MyProtected(); 11 $this->MyPrivate(); // 这行会产生一个致命错误 12 } 13 } 14 15 $myclass2 = new MyClass2; 16 $myclass2->MyPublic(); // 这行能被正常执行 17 $myclass2->Foo2(); // 公有的和受保护的都可执行,但私有的不行
第 16 行,调用之后,先在MyClass 2 中找 MyPublic 方法,没有找到,于是找他的父集,也就它继承的 MyClass 中找到了 MyPublic 方法,由于是公有的方法,所以可以调用,执行正常。
第 17 行,调用了 公有方法 Foo2 之后,里面包含了 3 个调用,对于公有的,和受保护的方法都与第16行一样,先从自己的里面找,没有找到,则去他的 父集MyClass 中找,找到就正常调用方法,而对于第三行的 那个私有方法调用,它就只能找寻自己内部有没有这个方法,没有则返回错误,不能去父集里直接调用它的私有方法。
虾面,再看另一个例子,看看是如何调用父集里的私有方法的,对比一下上面的例子:
1 class Bar 2 { 3 public function test() { 4 $this->testPrivate(); 5 $this->testPublic(); 6 } 7 8 public function testPublic() { 9 echo "Bar::testPublic\n"; 10 } 11 12 private function testPrivate() { 13 echo "Bar::testPrivate\n"; 14 } 15 } 16 17 class Foo extends Bar 18 { 19 public function testPublic() { 20 echo "Foo::testPublic\n"; 21 } 22 23 private function testPrivate() { 24 echo "Foo::testPrivate\n"; 25 } 26 } 27 28 $myFoo = new foo(); 29 $myFoo->test(); // Bar::testPrivate 30 // Foo::testPublic
第 29 行,调用 test 方法之后,先在 自己里面找,没有找到,所以找到 父集 Bar 中,在第 3 行找到了 test 方法,于是执行。test 方法中,又有两个调用,第一个 ,调用 testPrivate 私有方法,于是在自己里面找,这个自己里面 指的是 bar 的里面,因为这个 调用是在 父集里面进行的,并且是通过一个 公有的 test 方法,调用自身的私有方法,于是返回的是 bar 的 testPrivate 私有方法。第二个调用 testPublic ,因为 foo 里已经重新定义了一个公有的方法,所以 foo 里的 testPublic 会将 父集的 testPublic 方法覆盖,优先调用 foo 里的 testPublic 方法,所以返回的是 foo 的 testPublic 。
刚开始拍黄片,理解如有误,请指导~
最后再说一句:学习使我快乐:)
标签:
原文地址:http://www.cnblogs.com/lijiayi/p/php1.html