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>
Copy after login
有 __clone 和无 __clone
一个值得注意的地方 __clone() cannot accept any arguments
Copy after login
- 直接赋值 (复制), 不会产生新的对象
<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>
Copy after login- 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: #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>
Copy after login- __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>
Copy after login继承
<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>
Copy after login继承的时候权限只能越来越大, 不能变小
<span style="color: #00ffff;">class</span> <span style="color: #98fb98;">A</span> { <span style="color: #00ffff;">protected</span> <span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">a</span> = <span style="color: #ffa07a;">'a'</span>; <span style="color: #00ffff;">protected</span> <span style="color: #00ffff;">function</span> <span style="color: #87cefa;">f</span>() { <span style="color: #00ffff;">echo</span> <span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #7fffd4;">this</span>-><span style="color: #eedd82;">a</span>, <span style="color: #ffa07a;">'<br>'</span>; }}<span style="color: #00ffff;">class</span> <span style="color: #98fb98;">B</span> <span style="color: #00ffff;">extends</span> <span style="color: #98fb98;">A</span>{ <span style="color: #00ffff;">private</span> <span style="color: #00ffff;">function</span> <span style="color: #87cefa;">f</span>() { <span style="color: #00ffff;">echo</span> <span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #7fffd4;">this</span>-><span style="color: #eedd82;">a</span>, <span style="color: #ffa07a;">'<br>'</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: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">b</span>-><span style="color: #ffffff; background-color: #000000;">f</span>(); <span style="color: #ff7f24;">// </span><span style="color: #ff7f24;">报错</span>
Copy after loginprotected
<span style="color: #00ffff;">class</span> <span style="color: #98fb98;">A</span> { <span style="color: #00ffff;">protected</span> <span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">a</span> = <span style="color: #ffa07a;">'a'</span>; <span style="color: #00ffff;">public</span> <span style="color: #00ffff;">function</span> <span style="color: #87cefa;">f</span>() { <span style="color: #00ffff;">echo</span> <span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #7fffd4;">this</span>-><span style="color: #eedd82;">a</span>, <span style="color: #ffa07a;">'<br>'</span>; }}<span style="color: #00ffff;">class</span> <span style="color: #98fb98;">B</span> <span style="color: #00ffff;">extends</span> <span style="color: #98fb98;">A</span>{ <span style="color: #00ffff;">public</span> <span style="color: #00ffff;">function</span> <span style="color: #87cefa;">f</span>() { <span style="color: #00ffff;">echo</span> <span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #7fffd4;">this</span>-><span style="color: #eedd82;">a</span>, <span style="color: #ffa07a;">'<br>'</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;">可以继承 protected</span><span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">b</span>-><span style="color: #ffffff; background-color: #000000;">f</span>();
Copy after loginstatic
static 变量
所有实例化的实例化的类共享的变量, 其中一个改变了, 其他的也跟着改变class stu { public static $fee; function f($fee) { self::$fee += $fee; }}
Copy after loginstatic 方法
不可以操作$this 变量
, 使用 static 方法的情景, 一般的原则是某个方法中不包含$this
变量calss stu { static function func1() { static::func2(); } static function func2() { ... }}
Copy after login调用:
stu::func2();
,stu::func1();
final
使用 finnal 的场景:
- 出于安全的考虑, 某个类的方法不允许被修改
- 不希望被其他的类继承
final 不能修饰成员属性 (变量)
final 方法, 表示此方法不能被重写
<span style="color: #b0c4de;"><?php</span><span style="color: #00ffff;">class</span> <span style="color: #98fb98;">BaseClass</span> { <span style="color: #00ffff;">public</span> <span style="color: #00ffff;">function</span> <span style="color: #87cefa;">test</span>() { <span style="color: #00ffff;">echo</span> <span style="color: #ffa07a;">"BaseClass::test() called\n"</span>; } <span style="color: #00ffff;">final</span> <span style="color: #00ffff;">public</span> <span style="color: #00ffff;">function</span> <span style="color: #87cefa;">moreTesting</span>() { <span style="color: #00ffff;">echo</span> <span style="color: #ffa07a;">"BaseClass::moreTesting() called\n"</span>; }}<span style="color: #00ffff;">class</span> <span style="color: #98fb98;">ChildClass</span> <span style="color: #00ffff;">extends</span> <span style="color: #98fb98;">BaseClass</span> { <span style="color: #00ffff;">public</span> <span style="color: #00ffff;">function</span> <span style="color: #87cefa;">moreTesting</span>() { <span style="color: #00ffff;">echo</span> <span style="color: #ffa07a;">"ChildClass::moreTesting() called\n"</span>; }}<span style="color: #ff7f24;">// </span><span style="color: #ff7f24;">Results in Fatal error: Cannot override final method BaseClass::moreTesting()</span>
Copy after loginfinal 类, 表示此类不能被继续被
extends
<span style="color: #b0c4de;"><?php</span><span style="color: #00ffff;">final</span> <span style="color: #00ffff;">class</span> <span style="color: #98fb98;">BaseClass</span> { <span style="color: #00ffff;">public</span> <span style="color: #00ffff;">function</span> <span style="color: #87cefa;">test</span>() { <span style="color: #00ffff;">echo</span> <span style="color: #ffa07a;">"BaseClass::test() called\n"</span>; } <span style="color: #ff7f24;">// </span><span style="color: #ff7f24;">这里无论你是否将方法声明为 final,都没有关系</span> <span style="color: #00ffff;">final</span> <span style="color: #00ffff;">public</span> <span style="color: #00ffff;">function</span> <span style="color: #87cefa;">moreTesting</span>() { <span style="color: #00ffff;">echo</span> <span style="color: #ffa07a;">"BaseClass::moreTesting() called\n"</span>; }}<span style="color: #00ffff;">class</span> <span style="color: #98fb98;">ChildClass</span> <span style="color: #00ffff;">extends</span> <span style="color: #98fb98;">BaseClass</span> {}<span style="color: #ff7f24;">// </span><span style="color: #ff7f24;">产生 Fatal error: Class ChildClass may not inherit from final class (BaseClass)</span>
Copy after loginconst
<span style="color: #00ffff;">class</span> <span style="color: #98fb98;">MyClass</span> { <span style="color: #00ffff;">const</span> <span style="color: #98fb98;">constant</span> = <span style="color: #ffa07a;">'constant value'</span> ; <span style="color: #00ffff;">function</span> <span style="color: #87cefa;">showConstant</span> () { <span style="color: #00ffff;">echo</span> <span style="color: #00ffff;">self</span> :: constant . <span style="color: #ffa07a;">"\n"</span> ; }}<span style="color: #00ffff;">echo</span> <span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">class</span> :: constant . <span style="color: #ffa07a;">"\n"</span> ; <span style="color: #ff7f24;">// </span><span style="color: #ff7f24;">自 PHP 5.3.0 起</span>
Copy after login后期绑定, 又叫延迟绑定
延迟绑定的意思, self 的绑定是运行时候计算, 看下面
<span style="color: #00ffff;">class</span> <span style="color: #98fb98;">Par</span> { <span style="color: #00ffff;">public</span> <span style="color: #00ffff;">static</span> <span style="color: #00ffff;">function</span> <span style="color: #87cefa;">whoami</span>() { <span style="color: #00ffff;">echo</span> <span style="color: #ffa07a;">'parent'</span>, <span style="color: #ffa07a;">'<br>'</span>; } <span style="color: #00ffff;">public</span> <span style="color: #00ffff;">static</span> <span style="color: #00ffff;">function</span> <span style="color: #87cefa;">say</span>() { <span style="color: #00ffff;">self</span>::whoami(); } <span style="color: #00ffff;">public</span> <span style="color: #00ffff;">static</span> <span style="color: #00ffff;">function</span> <span style="color: #87cefa;">say2</span>() { <span style="color: #00ffff;">static</span>::whoami(); }}<span style="color: #00ffff;">class</span> <span style="color: #98fb98;">Sun</span> <span style="color: #00ffff;">extends</span> <span style="color: #98fb98;">Par</span> { <span style="color: #00ffff;">public</span> <span style="color: #00ffff;">static</span> <span style="color: #00ffff;">function</span> <span style="color: #87cefa;">whoami</span>() { <span style="color: #00ffff;">echo</span> <span style="color: #ffa07a;">'sun'</span>, <span style="color: #ffa07a;">'<br>'</span>; }}<span style="color: #7fffd4;">Sun</span>::say(); <span style="color: #ff7f24;">// </span><span style="color: #ff7f24;">parent, 因为执行环境变成了 parent</span><span style="color: #7fffd4;">Sun</span>::say2(); <span style="color: #ff7f24;">// </span><span style="color: #ff7f24;">sun, 保持静态</span>
Copy after login单例模式 instanceof
<span style="color: #00ffff;">class</span> <span style="color: #98fb98;">mysql</span> { <span style="color: #00ffff;">public</span> <span style="color: #00ffff;">static</span> <span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">ins</span>; <span style="color: #00ffff;">private</span> <span style="color: #00ffff;">function</span> <span style="color: #87cefa;">__construct</span>() { <span style="color: #ff7f24;">/* </span><span style="color: #ff7f24;">do something */</span> } <span style="color: #00ffff;">private</span> <span style="color: #00ffff;">function</span> <span style="color: #87cefa;">__clone</span> () {} <span style="color: #ff7f24;">// </span><span style="color: #ff7f24;">禁止继承的类修改自身, 也可以使用 final</span> <span style="color: #00ffff;">public</span> <span style="color: #00ffff;">static</span> <span style="color: #00ffff;">function</span> <span style="color: #87cefa;">getIns</span>() { <span style="color: #00ffff;">if</span> (!(<span style="color: #00ffff;">self</span>::<span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">ins</span> <span style="color: #00ffff;">instanceof</span> <span style="color: #98fb98;">mysql</span>)) { <span style="color: #00ffff;">self</span>::<span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">ins</span> = <span style="color: #00ffff;">new</span> <span style="color: #00ffff;">self</span>(); } <span style="color: #00ffff;">return</span> <span style="color: #00ffff;">self</span>::<span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">ins</span>; }}<span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">a</span> = <span style="color: #7fffd4;">mysql</span>::getIns();<span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">b</span> = <span style="color: #7fffd4;">mysql</span>::getIns();var_dump (<span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">a</span> === <span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">b</span>); <span style="color: #ff7f24;">// </span><span style="color: #ff7f24;">true</span>
Copy after login魔术方法
- __get
<span style="color: #00ffff;">class</span> <span style="color: #98fb98;">test</span> { <span style="color: #00ffff;">public</span> <span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">hello</span> = <span style="color: #ffa07a;">'normal hello'</span>; <span style="color: #00ffff;">public</span> <span style="color: #00ffff;">function</span> <span style="color: #87cefa;">__get</span>(<span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">args</span>) { <span style="color: #00ffff;">if</span> (<span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">args</span> == <span style="color: #ffa07a;">'hello'</span>) { <span style="color: #00ffff;">echo</span> <span style="color: #ffa07a;">'from get: hello'</span>; } <span style="color: #00ffff;">else</span> <span style="color: #00ffff;">if</span> (<span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">args</span> = <span style="color: #ffa07a;">'other'</span>) { <span style="color: #00ffff;">echo</span> <span style="color: #ffa07a;">'from get: other'</span>; } }}<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: #00ffff;">echo</span> <span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">t</span>-><span style="color: #eedd82;">hello</span>, <span style="color: #ffa07a;">'<br>'</span>; <span style="color: #ff7f24;">// </span><span style="color: #ff7f24;">normal hello, 如果存在不会调用 魔术方法</span><span style="color: #00ffff;">echo</span> <span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">t</span>-><span style="color: #eedd82;">other</span>; <span style="color: #ff7f24;">// </span><span style="color: #ff7f24;">不能调用, 调用魔术方法</span>
Copy after login- __set
<span style="color: #00ffff;">class</span> <span style="color: #98fb98;">test</span> { <span style="color: #00ffff;">public</span> <span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">hello</span> = <span style="color: #ffa07a;">'normal hello'</span>; <span style="color: #00ffff;">public</span> <span style="color: #00ffff;">function</span> <span style="color: #87cefa;">__set</span>(<span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">k</span>, <span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">v</span>) { <span style="color: #00ffff;">echo</span> <span style="color: #ffa07a;">'you want to set me! '</span>, <span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">k</span>, <span style="color: #ffa07a;">'<br>'</span>; <span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #7fffd4;">this</span>-><span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">k</span> = <span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">v</span>; }}<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: #eedd82;">ttt</span> = 222;<span style="color: #00ffff;">echo</span> <span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">t</span>-><span style="color: #eedd82;">ttt</span>; <span style="color: #ff7f24;">// </span><span style="color: #ff7f24;">可以设置</span><span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">t</span>-><span style="color: #eedd82;">hello</span> = <span style="color: #ffa07a;">'another hello'</span>;print_r(<span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">t</span>);<span style="color: #ff7f24;">// </span><span style="color: #ff7f24;">you want to set me! ttt</span><span style="color: #ff7f24;">// </span><span style="color: #ff7f24;">222</span><span style="color: #ff7f24;">// </span><span style="color: #ff7f24;">test Object</span><span style="color: #ff7f24;">// </span><span style="color: #ff7f24;">(</span><span style="color: #ff7f24;">// </span><span style="color: #ff7f24;">[hello] => another hello</span><span style="color: #ff7f24;">// </span><span style="color: #ff7f24;">[ttt] => 222</span><span style="color: #ff7f24;">// </span><span style="color: #ff7f24;">)</span>
Copy after login- __isset
class test { public function __isset($v) { return false; ..... return true; }}
Copy after login$t = new test();if (isset($t->value)) { echo 'isset';} else { echo 'noset';}
Copy after login- __unset
调用的属性不存在, 就会调用此函数, 主要用于友好操作- __call
无权调用的时候, 传递两个参数, (function_NAME, array function_ARGS)<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;">func_empty</span>() { <span style="color: #00ffff;">echo</span> <span style="color: #ffa07a;">'nothing here'</span>; } <span style="color: #00ffff;">public</span> <span style="color: #00ffff;">function</span> <span style="color: #87cefa;">__call</span> (<span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">func</span>, <span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">args</span>) { <span style="color: #00ffff;">self</span>::func_empty(); }}<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>();
Copy after login<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;">func_empty</span>() { <span style="color: #00ffff;">echo</span> <span style="color: #ffa07a;">'nothing here'</span>; } <span style="color: #00ffff;">public</span> <span style="color: #00ffff;">function</span> <span style="color: #87cefa;">__call</span> (<span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">func</span>, <span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">args</span>) { print_r(<span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">args</span>); <span style="color: #00ffff;">self</span>::func_empty(); }}<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;">abc</span>(<span style="color: #ffa07a;">'abc'</span>, <span style="color: #ffa07a;">'def'</span>);<span style="color: #ff7f24;">// </span><span style="color: #ff7f24;">Array ( [0] => abc [1] => def )</span>
Copy after login- __callStatic
public static function __callStatic ( $name , $arguments ) { ... }
Copy after login重载 覆盖
覆盖: override 指的是子类覆盖父类的方法, 在 PHP 中, 如果
子类和父类的参数不一样会有警告
重载: redeclare 指的是同一个类中包含两个相同名字的方法,PHP 不支持
实现重载的方法
func_num_args() 返回数据的参数的个数$arr = func_get_args() 让参数以数组的形式返回func_get_arg(0) 返回第一个参数func_get_arg(1) 返回第二个参数
Copy after login<span style="color: #00ffff;">public</span> <span style="color: #00ffff;">function</span> <span style="color: #87cefa;">f</span>() { <span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">arr</span> = func_get_args(); <span style="color: #00ffff;">foreach</span>(<span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">arr</span> <span style="color: #00ffff;">as</span> <span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">v</span>) { .... }}
Copy after login魔术常量
__LINE____FILE____DIR____FUNCTION____CLASS____METHOD__
Copy after login抽象类和接口
abstract
abstract class Car { abstract function func1();}class Fastcar extends Car { public function func1() { ... }}
Copy after login- 继承类必须实现抽象类的 所有 方法
- 抽象类可以有自己的属性
- 抽象类可以有自己的实现方法, 也叫具体方法, interface 没有
- 可以有 protected 方法, interface 不可以
interface
<span style="color: #00ffff;">interface</span> <span style="color: #98fb98;">iUsb</span> { <span style="color: #00ffff;">public</span> <span style="color: #00ffff;">function</span> <span style="color: #87cefa;">f</span>();}<span style="color: #00ffff;">class</span> <span style="color: #98fb98;">phone</span> <span style="color: #00ffff;">implements</span> <span style="color: #98fb98;">iUsb</span> { <span style="color: #00ffff;">public</span> <span style="color: #00ffff;">function</span> <span style="color: #87cefa;">f</span>() { .. }}
Copy after login定义规范
当多个类, 之间平级的, 有相同的方法, 但是实现不同
Copy after login类可以实现多个接口, 接口可以实现多个接口
class t1 implements i1, i2, i3 { }interface i1 extends i2, i2, i3 {}
Copy after login- 继承类要实现 接口的全部方法
- interface 不能有 private 的方法
- interface 里面的属性只能是 常量
- interface 里面不能实现方法, 抽象类可以, (可以理解接口里面全都是抽象方法)
- interface 可以定义常量
<span style="color: #00ffff;">class</span> <span style="color: #98fb98;">Monkey</span> { <span style="color: #00ffff;">public</span> <span style="color: #00ffff;">function</span> <span style="color: #87cefa;">climb</span>() { ... }}<span style="color: #00ffff;">interface</span> <span style="color: #98fb98;">iBirdable</span> { <span style="color: #00ffff;">public</span> <span style="color: #00ffff;">function</span> <span style="color: #87cefa;">fly</span>();}<span style="color: #00ffff;">interface</span> <span style="color: #98fb98;">iFishable</span> { <span style="color: #00ffff;">public</span> <span style="color: #00ffff;">function</span> <span style="color: #87cefa;">swim</span>();}<span style="color: #00ffff;">class</span> <span style="color: #98fb98;">NewMonkey</span> <span style="color: #00ffff;">extends</span> <span style="color: #98fb98;">Monkey</span> <span style="color: #00ffff;">implements</span> <span style="color: #98fb98;">iBirdable</span>, <span style="color: #98fb98;">iFishable</span> { <span style="color: #00ffff;">public</span> <span style="color: #00ffff;">function</span> <span style="color: #87cefa;">fly</span>() { ... } <span style="color: #00ffff;">public</span> <span style="color: #00ffff;">function</span> <span style="color: #87cefa;">swim</span>() { ... }}
Copy after login抽象类和接口的区别我不是
很熟悉
T_T, mark 个 todo 以后再来补充- 如果要创建一个模型, 这个模型将由一些紧密的对象采用, 就可以使用抽象类. 如果要创建由一些不相关对象采用的功能, 使用接口
- 如果必须从多个来源继承行为, 就使用接口. 接口可以实现多个, 不可以继承多个抽象类
- 如果所有的类会有共享一个公共的行为实现, 就使用抽象类, 并在其中的实现该行为, 在接口中无法实现具体方法
命名空间
如果文件 1 有
test
对象, 文件 2 也有test
对象
在文件 3require 'file1.php';require 'file2.php';
Copy after login那么就会出现冲突
test1.php
<span style="color: #b0c4de;"><?php</span><span style="color: #00ffff;">namespace</span> <span style="color: #98fb98;">test\file1</span>;<span style="color: #00ffff;">class</span> <span style="color: #98fb98;">test</span> { <span style="color: #00ffff;">public</span> <span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">val</span> = <span style="color: #ffa07a;">'this is file 1'</span>;}
Copy after logintest2.php
<span style="color: #b0c4de;"><?php</span><span style="color: #00ffff;">namespace</span> <span style="color: #98fb98;">test\file2</span>; <span style="color: #ff7f24;"># 也可以使用别的命名空间 ...\...\...\...</span><span style="color: #00ffff;">class</span> <span style="color: #98fb98;">test</span> { <span style="color: #00ffff;">public</span> <span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">val</span> = <span style="color: #ffa07a;">'this is file 2'</span>;}
Copy after logintest.php
用于加载访问
<span style="color: #b0c4de;"><?php</span><span style="color: #00ffff;">require</span> <span style="color: #ffa07a;">'test1.php'</span>;<span style="color: #00ffff;">require</span> <span style="color: #ffa07a;">'test2.php'</span>;<span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">t1</span> = <span style="color: #00ffff;">new</span> <span style="color: #98fb98;">test\file1\test</span>();<span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">t2</span> = <span style="color: #00ffff;">new</span> <span style="color: #98fb98;">test\file2\test</span>();<span style="color: #00ffff;">echo</span> <span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">t1</span>-><span style="color: #eedd82;">val</span>, <span style="color: #ffa07a;">'<br>'</span>; <span style="color: #ff7f24;">// </span><span style="color: #ff7f24;">this is file1</span><span style="color: #00ffff;">echo</span> <span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">t2</span>-><span style="color: #eedd82;">val</span>, <span style="color: #ffa07a;">'<br>'</span>; <span style="color: #ff7f24;">// </span><span style="color: #ff7f24;">this is file2</span><span style="color: #00ffff;">use</span> <span style="color: #98fb98;">test\file1</span> <span style="color: #00ffff;">as</span> <span style="color: #98fb98;">file1</span>;<span style="color: #00ffff;">use</span> <span style="color: #98fb98;">test\file2</span> <span style="color: #00ffff;">as</span> <span style="color: #98fb98;">file2</span>;<span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">t3</span> = <span style="color: #00ffff;">new</span> <span style="color: #98fb98;">file1\test</span>();<span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">t4</span> = <span style="color: #00ffff;">new</span> <span style="color: #98fb98;">file2\test</span>();<span style="color: #00ffff;">echo</span> <span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">t3</span>-><span style="color: #eedd82;">val</span>, <span style="color: #ffa07a;">'<br>'</span>; <span style="color: #ff7f24;">// </span><span style="color: #ff7f24;">this is file1</span><span style="color: #00ffff;">echo</span> <span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">t4</span>-><span style="color: #eedd82;">val</span>, <span style="color: #ffa07a;">'<br>'</span>; <span style="color: #ff7f24;">// </span><span style="color: #ff7f24;">this is file2</span>
Copy after login其他对象方法
class_alias(class_name, new_classname)get_class (OBJ)$arr = get_declared_classes() # 返回已经定义了的类get_parent_class (OBJ)interface_exists (INTER) # 是否存在接口method_exists (OBJ, FUNC_NAME) # 是否存在某个方法
Copy after login自动加载
<span style="color: #00ffff;">function</span> <span style="color: #87cefa;">__autoload</span> ( <span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">class_name</span> ) { <span style="color: #00ffff;">require</span> <span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">class_name</span> . <span style="color: #ffa07a;">'.php'</span> ;}<span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">obj</span> = <span style="color: #00ffff;">new</span> <span style="color: #98fb98;">MyClass1</span> (); <span style="color: #ff7f24;">// </span><span style="color: #ff7f24;">自动会调用上面的哪个函数, 参数名是 MyClass1</span><span style="color: #ffffff; background-color: #000000;">$</span><span style="color: #eedd82;">obj2</span> = <span style="color: #00ffff;">new</span> <span style="color: #98fb98;">MyClass2</span> (); <span style="color: #ff7f24;">// </span><span style="color: #ff7f24;">自动会调用上面的哪个函数, 参数名是 MyClass2</span>
Copy after login为什么函数里面的 require class 的生活周期可以到外层, 原因像下面的,
__autoload 被执行之后, 就相当于把函数里面的代码展示出来<span style="color: #00ffff;">function</span> <span style="color: #87cefa;">well</span>() { <span style="color: #00ffff;">function</span> <span style="color: #87cefa;">test</span>() { <span style="color: #00ffff;">echo</span> <span style="color: #ffa07a;">'inside '</span>, <span style="color: #ffa07a;">'<br>'</span>; }}well(); <span style="color: #ff7f24;">// </span><span style="color: #ff7f24;">一定要先调用</span>test(); <span style="color: #ff7f24;">// </span><span style="color: #ff7f24;">inside</span>
Copy after login__autoload 的实现spl_autoload_register —— 注册给定的函数作为 __autoload 的实现
Copy after login<span style="color: #00ffff;">function</span> <span style="color: #87cefa;">func</span>() { <span style="color: #00ffff;">require</span> <span style="color: #ffa07a;">'...'</span>;}spl_autoload_register(func);
Copy after loginTODO SPL 函数
Statement of this WebsiteThe content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cnLatest Articles by Author-
2024-10-22 09:46:29
-
2024-10-13 13:53:41
-
2024-10-12 12:15:51
-
2024-10-11 22:47:31
-
2024-10-11 19:36:51
-
2024-10-11 15:50:41
-
2024-10-11 15:07:41
-
2024-10-11 14:21:21
-
2024-10-11 12:59:11
-
2024-10-11 12:17:31
Latest IssuesThere is no output in the parent window document.onclick = function(){ window.opener.document.write('I am the output of the child ...From 2024-04-18 23:52:34011284Using Eloquent for internal querying The image address contains the location and total number of users. Users::with(['address'=...From 2024-04-06 16:45:5001515Related TopicsMore>- What is function
- js function function usage
- What does class mean in c language?
- What is the function of Huawei nfc?
- How to solve the problem that wlan does not have a valid ip configuration
- How to withdraw fees on WeChat
- What to do if you can't delete files on your computer
- Euro-Italian Exchange official app
Popular RecommendationsPopular TutorialsMore>-
JAVA Beginner's Video Tutorial2514025
Latest DownloadsMore> - __set
- clone 会生成一个新的对象, 但不会调用构造函数