PHP – オブジェクト指向
目次
- 関数呼び出し
- __clone を使用する場合と __clone を使用しない場合
- 継承
- 保護
- static
- final
- const
- 遅延バインディング、遅延バインディングとも呼ばれます
- シングルトン モードのインスタンス
- マジック メソッド
- オーバーロード カバレッジ
- マジック定数
- 抽象クラスとインターフェイス
- 名前空間
- その他のオブジェクトメソッド
- オートロード
- 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>
ログイン後にコピー- クローンは新しいオブジェクトを生成しますが、コンストラクターは呼び出しません
<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>
ログイン後にコピー- __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>
ログイン後にコピー継承する場合、権限は小さくなることはなく、どんどん大きくなるだけです
<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>
ログイン後にコピー保護
<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>();
ログイン後にコピーstatic
static 变量
インスタンス化されたすべてのクラスで共有される変数 (1 つある場合)そのうちの変更があれば、他のものも変更されますclass stu { public static $fee; function f($fee) { self::$fee += $fee; }}
ログイン後にコピーstatic 方法
は操作できません$this 变量
。静的メソッドの場合、一般原則はメソッドが実行するというものです。呼び出す$this
変数calss stu { static function func1() { static::func2(); } static function func2() { ... }}
ログイン後にコピーが含まれていません:
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>
ログイン後にコピー最終クラス。このクラスを
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>
ログイン後にコピーconst<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>
ログイン後にコピー遅延バインディング、遅延バインディングとも呼ばれます遅延バインディングの意味、自己のバインディングは実行時に計算されます。以下を参照してください<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>
ログイン後にコピーシングルケースモード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>
ログイン後にコピーマジックメソッド- __get
- __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;">__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>
ログイン後にコピー__isset<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>
ログイン後にコピー __unsetclass test { public function __isset($v) { return false; ..... return true; }}
ログイン後にコピー$t = new test();if (isset($t->value)) { echo 'isset';} else { echo 'noset';}
ログイン後にコピー- 呼び出された属性が存在しない場合、この関数が呼び出されます。これは主にフレンドリーな操作に使用されます
__call- 呼び出す権限がない場合は、2 つのパラメータ (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>();
ログイン後にコピー__callStatic<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>
ログイン後にコピーpublic static function __callStatic ( $name , $arguments ) { ... }
ログイン後にコピーオーバーロードオーバーライド: オーバーライドは、親クラスのメソッドをオーバーライドするサブクラスを指します。PHP では、子类和父类的参数不一样会有警告
オーバーロード: redeclare は同じ A クラスを指します。同じ名前のメソッドPHP 不支持
实现重载的方法
func_num_args() 返回数据的参数的个数$arr = func_get_args() 让参数以数组的形式返回func_get_arg(0) 返回第一个参数func_get_arg(1) 返回第二个参数
ログイン後にコピー<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>) { .... }}
ログイン後にコピー魔术常量
__LINE____FILE____DIR____FUNCTION____CLASS____METHOD__
ログイン後にコピー抽象类和接口
abstract
abstract class Car { abstract function func1();}class Fastcar extends Car { public function func1() { ... }}
ログイン後にコピー- 继承类必须实现抽象类的 所有 方法
- 抽象类可以有自己的属性
- 抽象类可以有自己的实现方法, 也叫具体方法, 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>() { .. }}
ログイン後にコピー定义规范
当多个类, 之间平级的, 有相同的方法, 但是实现不同
ログイン後にコピー类可以实现多个接口, 接口可以实现多个接口
class t1 implements i1, i2, i3 { }interface i1 extends i2, i2, i3 {}
ログイン後にコピー- 继承类要实现 接口的全部方法
- 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>() { ... }}
ログイン後にコピー抽象类和接口的区别我不是
很熟悉
T_T, mark 个 todo 以后再来补充- 如果要创建一个模型, 这个模型将由一些紧密的对象采用, 就可以使用抽象类. 如果要创建由一些不相关对象采用的功能, 使用接口
- 如果必须从多个来源继承行为, 就使用接口. 接口可以实现多个, 不可以继承多个抽象类
- 如果所有的类会有共享一个公共的行为实现, 就使用抽象类, 并在其中的实现该行为, 在接口中无法实现具体方法
命名空间
如果文件 1 有
test
对象, 文件 2 也有test
对象
在文件 3require 'file1.php';require 'file2.php';
ログイン後にコピー那么就会出现冲突
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>;}
ログイン後にコピーtest2.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>;}
ログイン後にコピーtest.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>
ログイン後にコピー其他对象方法
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) # 是否存在某个方法
ログイン後にコピー自动加载
<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>
ログイン後にコピー为什么函数里面的 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>
ログイン後にコピー__autoload 的实现spl_autoload_register —— 注册给定的函数作为 __autoload 的实现
ログイン後にコピー<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);
ログイン後にコピーTODO SPL 函数
このウェブサイトの声明この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。著者別の最新記事-
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
最新の問題function_exists() はカスタム関数を決定できません Function test () {return true;} if (function_exists ('test')) {echo "テストは関数です";から 2024-04-29 11:01:01021429親ウィンドウには出力がありません document.onclick = function(){ window.opener.document.write('私は子ウィンドウの出力です');から 2024-04-18 23:52:34011284入力フィールドメソッドの戻り値の合計を取得します。 ユーザーが入力した合計値を見つけようとしています。数値と同じ値を乗算する集計を取得します letDem200=document.querySelector(".input...から 2024-04-06 18:19:3701380内部クエリに Eloquent を使用する 画像アドレスには、場所とユーザーの総数が含まれています。 Users::with(['address'=>function($query){$query->where(...から 2024-04-06 16:45:5001515
- クローンは新しいオブジェクトを生成しますが、コンストラクターは呼び出しません