PHP — 面向对象
<?xml version=”1.0″ encoding=”utf-8″?>
PHP – 面向对象
Table of Contents
- 函数调用
- 有 __clone 和无 __clone
- 继承
- protected
- static
- final
- const
- 后期绑定, 又叫延迟绑定
- 单例模式 instanceof
- 魔术方法
- 重载 覆盖
- 魔术常量
- 抽象类和接口
- 命名空间
- 其他对象方法
- 自动加载
- TODO SPL 函数
函数调用
<span style="color: #00ffff">class</span> <span style="color: #98fb98">test</span> { <span style="color: #00ffff">public</span> <span style="color: #00ffff">function</span> <span style="color: #87cefa">f1</span>() { <span style="color: #00ffff">echo</span> <span style="color: #ffa07a">'you call me!'</span>; } <span style="color: #00ffff">public</span> <span style="color: #00ffff">function</span> <span style="color: #87cefa">f2</span>() { f1(); }}<span style="color: #ffffff;background-color: #000000">$</span><span style="color: #eedd82">t</span> = <span style="color: #00ffff">new</span> <span style="color: #98fb98">test</span>();<span style="color: #ffffff;background-color: #000000">$</span><span style="color: #eedd82">t</span>-><span style="color: #ffffff;background-color: #000000">f2</span>(); <span style="color: #ff7f24">// </span><span style="color: #ff7f24">报错</span><span style="color: #ff7f24">// </span><span style="color: #ff7f24">public function f2() { // 正确</span><span style="color: #ff7f24">// </span><span style="color: #ff7f24">self::f1();</span><span style="color: #ff7f24">// </span><span style="color: #ff7f24">}</span><span style="color: #ff7f24">// </span><span style="color: #ff7f24">public function f2() { // 正确</span><span style="color: #ff7f24">// </span><span style="color: #ff7f24">static::f1();</span><span style="color: #ff7f24">// </span><span style="color: #ff7f24">}</span>
有 __clone 和无 __clone
一个值得注意的地方 __clone() cannot accept any arguments
- 直接赋值 (复制), 不会产生新的对象
<span style="color: #00ffff">class</span> <span style="color: #98fb98">test</span> { <span style="color: #00ffff">public</span> <span style="color: #00ffff">function</span> <span style="color: #87cefa">__construct</span>() { <span style="color: #00ffff">echo</span> <span style="color: #ffa07a">'ok'</span>; } <span style="color: #00ffff">public</span> <span style="color: #00ffff">function</span> <span style="color: #87cefa">__destruct</span>() { <span style="color: #00ffff">echo</span> <span style="color: #ffa07a">'fail'</span>, <span style="color: #ffa07a">'<br>'</span>; }}<span style="color: #ffffff;background-color: #000000">$</span><span style="color: #eedd82">a</span> = <span style="color: #00ffff">new</span> <span style="color: #98fb98">test</span>();<span style="color: #ffffff;background-color: #000000">$</span><span style="color: #eedd82">b</span> = <span style="color: #ffffff;background-color: #000000">$</span><span style="color: #eedd82">a</span>; <span style="color: #ff7f24">// </span><span style="color: #ff7f24">指向同一个内存空间</span><span style="color: #00ffff">echo</span> <span style="color: #ffa07a">'<hr>'</span>;<span style="color: #ff7f24">// </span><span style="color: #ff7f24">ok</span><span style="color: #ff7f24">// </span><span style="color: #ff7f24">-----</span><span style="color: #ff7f24">// </span><span style="color: #ff7f24">fail</span>
- clone 会生成一个新的对象, 但不会调用构造函数
<span style="color: #00ffff">class</span> <span style="color: #98fb98">test</span> { <span style="color: #00ffff">public<i>*本5文来源gaodai$ma#com搞$$代**码)网@</i><img>搞代码gaodaima</img></span> <span style="color: #00ffff">function</span> <span style="color: #87cefa">__construct</span>() { <span style="color: #00ffff">echo</span> <span style="color: #ffa07a">'ok'</span>; } <span style="color: #00ffff">public</span> <span style="color: #00ffff">function</span> <span style="color: #87cefa">__destruct</span>() { <span style="color: #00ffff">echo</span> <span style="color: #ffa07a">'fail'</span>, <span style="color: #ffa07a">'<br>'</span>; }}<span style="color: #ffffff;background-color: #000000">$</span><span style="color: #eedd82">a</span> = <span style="color: #00ffff">new</span> <span style="color: #98fb98">test</span>();<span style="color: #ffffff;background-color: #000000">$</span><span style="color: #eedd82">b</span> = <span style="color: #00ffff">clone</span> <span style="color: #ffffff;background-color: #000000">$</span><span style="color: #eedd82">a</span>; <span style="color: #ff7f24">// </span><span style="color: #ff7f24">指向不同的 内存空间</span><span style="color: #00ffff">echo</span> <span style="color: #ffa07a">'<hr>'</span>;<span style="color: #ff7f24">// </span><span style="color: #ff7f24">ok</span><span style="color: #ff7f24">// </span><span style="color: #ff7f24">---------------</span><span style="color: #ff7f24">// </span><span style="color: #ff7f24">fail</span><span style="color: #ff7f24">// </span><span style="color: #ff7f24">fail</span>
- __clone 调用析构函数
<span style="color: #00ffff">class</span> <span style="color: #98fb98">test</span> { <span style="color: #00ffff">public</span> <span style="color: #00ffff">function</span> <span style="color: #87cefa">__construct</span>() { <span style="color: #00ffff">echo</span> <span style="color: #ffa07a">'ok'</span>, <span style="color: #ffa07a">'<br>'</span>; } <span style="color: #00ffff">public</span> <span style="color: #00ffff">function</span> <span style="color: #87cefa">__destruct</span>() { <span style="color: #00ffff">echo</span> <span style="color: #ffa07a">'fail'</span>, <span style="color: #ffa07a">'<br>'</span>; } <span style="color: #00ffff">public</span> <span style="color: #00ffff">function</span> <span style="color: #87cefa">__clone</span>() { <span style="color: #00ffff">return</span> <span style="color: #00ffff">self</span>::__construct(); }}<span style="color: #ffffff;background-color: #000000">$</span><span style="color: #eedd82">a</span> = <span style="color: #00ffff">new</span> <span style="color: #98fb98">test</span>();<span style="color: #ffffff;background-color: #000000">$</span><span style="color: #eedd82">b</span> = <span style="color: #00ffff">clone</span> <span style="color: #ffffff;background-color: #000000">$</span><span style="color: #eedd82">a</span>; <span style="color: #ff7f24">// </span><span style="color: #ff7f24">指向不同的 内存空间</span><span style="color: #00ffff">echo</span> <span style="color: #ffa07a">'<hr>'</span>;<span style="color: #ff7f24">// </span><span style="color: #ff7f24">ok</span><span style="color: #ff7f24">// </span><span style="color: #ff7f24">ok</span><span style="color: #ff7f24">// </span><span style="color: #ff7f24">-----</span><span style="color: #ff7f24">// </span><span style="color: #ff7f24">fail</span><span style="color: #ff7f24">// </span><span style="color: #ff7f24">fail</span>
继承
<span style="color: #b0c4de"><?php</span><span style="color: #00ffff">class</span> <span style="color: #98fb98">A</span> { <span style="color: #00ffff">function</span> <span style="color: #87cefa">foo</span>() { <span style="color: #00ffff">if</span> (<span style="color: #00ffff">isset</span>(<span style="color: #ffffff;background-color: #000000">$</span><span style="color: #7fffd4">this</span>)) { <span style="color: #00ffff">echo</span> <span style="color: #ffa07a">'this is defined ('</span>, get_class(<span style="color: #ffffff;background-color: #000000">$</span><span style="color: #7fffd4">this</span>), <span style="color: #ffa07a">')'</span>, <span style="color: #ffa07a">'<br>'</span>; } <span style="color: #00ffff">else</span> { <span style="color: #00ffff">echo</span> <span style="color: #ffa07a">'this is not defined'</span>, <span style="color: #ffa07a">'<br>'</span>; } }}<span style="color: #00ffff">class</span> <span style="color: #98fb98">B</span> { <span style="color: #00ffff">function</span> <span style="color: #87cefa">bar</span>() { <span style="color: #7fffd4">A</span>::foo(); }}<span style="color: #ffffff;background-color: #000000">$</span><span style="color: #eedd82">a</span> = <span style="color: #00ffff">new</span> <span style="color: #98fb98">A</span>(); <span style="color: #ff7f24">// </span><span style="color: #ff7f24">this 变成 A</span><span style="color: #ffffff;background-color: #000000">$</span><span style="color: #eedd82">a</span>-><span style="color: #ffffff;background-color: #000000">foo</span>();<span style="color: #7fffd4">A</span>::foo();<span style="color: #ff7f24">// </span><span style="color: #ff7f24">this is defined (A)</span><span style="color: #ff7f24">// </span><span style="color: #ff7f24">this is not defined</span><span style="color: #ffffff;background-color: #000000">$</span><span style="color: #eedd82">b</span> = <span style="color: #00ffff">new</span> <span style="color: #98fb98">B</span>(); <span style="color: #ff7f24">// </span><span style="color: #ff7f24">this 变成 B</span><span style="color: #ffffff;background-color: #000000">$</span><span style="color: #eedd82">b</span>-><span style="color: #ffffff;background-color: #000000">bar</span>();<span style="color: #7fffd4">B</span>::bar();<span style="color: #ff7f24">// </span><span style="color: #ff7f24">this is defined (B)</span><span style="color: #ff7f24">// </span><span style="color: #ff7f24">this is not defined</span>
- clone 会生成一个新的对象, 但不会调用构造函数