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>
Copier après la connexion- 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>
Copier après la connexion- __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>
Copier après la connexion继承
<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>
Copier après la connexion继承的时候权限只能越来越大, 不能变小
<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>
Copier après la connexionprotected
<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>();
Copier après la connexionstatic
static 变量
所有实例化的实例化的类共享的变量, 其中一个改变了, 其他的也跟着改变class stu { public static $fee; function f($fee) { self::$fee += $fee; }}
Copier après la connexionstatic 方法
不可以操作$this 变量
, 使用 static 方法的情景, 一般的原则是某个方法中不包含$this
变量calss stu { static function func1() { static::func2(); } static function func2() { ... }}
Copier après la connexion调用:
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>
Copier après la connexionfinal 类, 表示此类不能被继续被
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>
Copier après la connexionconst
<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>
Copier après la connexion后期绑定, 又叫延迟绑定
延迟绑定的意思, 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>
Copier après la connexion单例模式 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>
Copier après la connexion魔术方法
- __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>
Copier après la connexion- __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>
Copier après la connexion- __isset
class test { public function __isset($v) { return false; ..... return true; }}
Copier après la connexion$t = new test();if (isset($t->value)) { echo 'isset';} else { echo 'noset';}
Copier après la connexion- __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>();
Copier après la connexion<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>
Copier après la connexion- __callStatic
public static function __callStatic ( $name , $arguments ) { ... }
Copier après la connexion重载 覆盖
覆盖: override 指的是子类覆盖父类的方法, 在 PHP 中, 如果
子类和父类的参数不一样会有警告
重载: redeclare 指的是同一个类中包含两个相同名字的方法,PHP 不支持
实现重载的方法
func_num_args() 返回数据的参数的个数$arr = func_get_args() 让参数以数组的形式返回func_get_arg(0) 返回第一个参数func_get_arg(1) 返回第二个参数
Copier après la connexion<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>) { .... }}
Copier après la connexion魔术常量
__LINE____FILE____DIR____FUNCTION____CLASS____METHOD__
Copier après la connexion抽象类和接口
abstract
abstract class Car { abstract function func1();}class Fastcar extends Car { public function func1() { ... }}
Copier après la connexion- 继承类必须实现抽象类的 所有 方法
- 抽象类可以有自己的属性
- 抽象类可以有自己的实现方法, 也叫具体方法, 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>() { .. }}
Copier après la connexion定义规范
当多个类, 之间平级的, 有相同的方法, 但是实现不同
Copier après la connexion类可以实现多个接口, 接口可以实现多个接口
class t1 implements i1, i2, i3 { }interface i1 extends i2, i2, i3 {}
Copier après la connexion- 继承类要实现 接口的全部方法
- 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>() { ... }}
Copier après la connexion抽象类和接口的区别我不是
很熟悉
T_T, mark 个 todo 以后再来补充- 如果要创建一个模型, 这个模型将由一些紧密的对象采用, 就可以使用抽象类. 如果要创建由一些不相关对象采用的功能, 使用接口
- 如果必须从多个来源继承行为, 就使用接口. 接口可以实现多个, 不可以继承多个抽象类
- 如果所有的类会有共享一个公共的行为实现, 就使用抽象类, 并在其中的实现该行为, 在接口中无法实现具体方法
命名空间
如果文件 1 有
test
对象, 文件 2 也有test
对象
在文件 3require 'file1.php';require 'file2.php';
Copier après la connexion那么就会出现冲突
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>;}
Copier après la connexiontest2.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>;}
Copier après la connexiontest.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>
Copier après la connexion其他对象方法
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) # 是否存在某个方法
Copier après la connexion自动加载
<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>
Copier après la connexion为什么函数里面的 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>
Copier après la connexion__autoload 的实现spl_autoload_register —— 注册给定的函数作为 __autoload 的实现
Copier après la connexion<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);
Copier après la connexionTODO SPL 函数
Déclaration de ce site WebLe contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cnOutils d'IA chauds
Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes
AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.
Undress AI Tool
Images de déshabillage gratuites
Clothoff.io
Dissolvant de vêtements AI
Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !
Article chaud
Assassin's Creed Shadows: Solution d'énigmes de coquille3 Il y a quelques semaines By DDDQuoi de neuf dans Windows 11 KB5054979 et comment résoudre les problèmes de mise à jour2 Il y a quelques semaines By DDDOù trouver la courte de la grue à atomide atomique3 Il y a quelques semaines By DDD<🎜>: Dead Rails - Comment relever chaque défi4 Il y a quelques semaines By DDDGuide de l'atomfall: emplacements des articles, guides de quête et conseils1 Il y a quelques mois By DDDOutils chauds
Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit
SublimeText3 version chinoise
Version chinoise, très simple à utiliser
Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP
Dreamweaver CS6
Outils de développement Web visuel
SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)
Sujets chauds
Tutoriel CakePHP1393
52
Tutoriel C#1207
24
La montre intelligente Huawei Watch GT 5 reçoit une mise à jour avec de nouvelles fonctionnalités Oct 03, 2024 am 06:25 AM
Huawei déploie la version logicielle 5.0.0.100 (C00M01) pour les montres intelligentes Watch GT 5 et Watch GT 5 Pro dans le monde entier. Ces deux montres intelligentes ont récemment été lancées en Europe, le modèle standard étant le modèle le moins cher de l’entreprise. Cette harmonie
Le rêve du colonel Sanders de Tekken frit par KFC Oct 02, 2024 am 06:07 AM
Katsuhiro Harada, le réalisateur de la série Tekken, a un jour sérieusement tenté d'impliquer le colonel Sanders dans le jeu de combat emblématique. Dans une interview avec TheGamer, Harada a révélé qu'il avait présenté l'idée à KFC Japon, dans l'espoir d'ajouter la légende de la restauration rapide comme g
Les critiques de Cybertruck FSD font l'éloge du changement de voie rapide et des visualisations en plein écran Oct 01, 2024 am 06:16 AM
Tesla déploie la dernière version 12.5.5 de conduite entièrement autonome (supervisée) et avec elle vient enfin l'option Cybertruck FSD promise, dix mois après la mise en vente du pick-up avec la fonctionnalité incluse dans le prix de finition de la série Foundation. F
Premier aperçu : fuite de la vidéo de déballage du prochain chargeur mural Anker Zolo à 4 ports 140 W avec écran Oct 01, 2024 am 06:32 AM
Plus tôt en septembre 2024, le chargeur Zolo 140 W d'Anker a fait l'objet d'une fuite, et c'était un gros problème puisqu'il s'agissait du tout premier chargeur mural doté d'un écran de l'entreprise. Maintenant, une nouvelle vidéo de déballage de Xiao Li TV sur YouTube nous donne un aperçu direct du salut.
Garmin publie des améliorations de l'activité Adventure Racing pour plusieurs montres intelligentes via une nouvelle mise à jour Oct 01, 2024 am 06:40 AM
Garmin termine le mois avec une nouvelle série de mises à jour stables pour ses dernières montres intelligentes haut de gamme. Pour récapituler, la société a publié le logiciel système 11.64 pour lutter contre l'épuisement élevé de la batterie des Enduro 3, Fenix E et Fenix 8 (prix actuel : 1 099,99 $ sur Amazon).
Le nouveau chauffe-huile en graphène Xiaomi Mijia avec HyperOS arrive Oct 02, 2024 pm 09:02 PM
Xiaomi lancera prochainement le chauffe-huile Mijia Graphene en Chine. La société a récemment mené avec succès une campagne de financement participatif pour le produit de maison intelligente, hébergé sur sa plateforme Youpin. Selon la page, l'appareil a déjà commencé à être expédié vers
Le Samsung Galaxy Z Fold Special Edition a été révélé pour atterrir fin octobre alors que des noms contradictoires émergent Oct 01, 2024 am 06:21 AM
Le lancement du très attendu pliable « Special Edition » de Samsung a pris une autre tournure. Ces dernières semaines, les rumeurs concernant le soi-disant Galaxy Z Fold Special Edition sont devenues plutôt silencieuses. Au lieu de cela, l’accent s’est déplacé vers la série Galaxy S25, y compris
Manjaro 24.1 \'Xahea\' est lancé avec KDE Plasma 6.1.5, VirtualBox 7.1 et plus Oct 02, 2024 am 06:06 AM
Avec une histoire de plus d'une décennie, Manjaro est considérée comme l'une des distributions Linux les plus conviviales, adaptée aussi bien aux débutants qu'aux utilisateurs expérimentés, étant facile à installer et à utiliser. Principalement développée en Autriche, en Allemagne et en France, cette distribution basée sur Arch
- __set
- clone 会生成一个新的对象, 但不会调用构造函数