Maison  >  Article  >  développement back-end  >  PHP - 面向对象

PHP - 面向对象

WBOY
WBOYoriginal
2016-06-13 12:23:34954parcourir

PHP -- 面向对象

PHP – 面向对象

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;">&#25253;&#38169;</span><span style="color: #ff7f24;">// </span><span style="color: #ff7f24;">public function f2() {  // &#27491;&#30830;</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() {  // &#27491;&#30830;</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
  1. 直接赋值 (复制), 不会产生新的对象
    <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;">&#25351;&#21521;&#21516;&#19968;&#20010;&#20869;&#23384;&#31354;&#38388;</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>
  2. 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;">&#25351;&#21521;&#19981;&#21516;&#30340; &#20869;&#23384;&#31354;&#38388;</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>
  3. __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;">&#25351;&#21521;&#19981;&#21516;&#30340; &#20869;&#23384;&#31354;&#38388;</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 &#21464;&#25104; 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 &#21464;&#25104; 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;">&#25253;&#38169;</span>

    protected

    <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;">&#21487;&#20197;&#32487;&#25215; 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 变量
    所有实例化的实例化的类共享的变量, 其中一个改变了, 其他的也跟着改变

    class stu {    public static $fee;    function f($fee) {        self::$fee += $fee;    }}

    static 方法
    不可以操作 $this 变量, 使用 static 方法的情景, 一般的原则是某个方法中不包含 $this 变量

    calss stu {    static function func1() {        static::func2();    }    static function func2() {         ...    }}

    调用: stu::func2();, stu::func1();

    final

    使用 finnal 的场景:

    1. 出于安全的考虑, 某个类的方法不允许被修改
    2. 不希望被其他的类继承

    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>

    final 类, 表示此类不能被继续被 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;">&#36825;&#37324;&#26080;&#35770;&#20320;&#26159;&#21542;&#23558;&#26041;&#27861;&#22768;&#26126;&#20026; final&#65292;&#37117;&#27809;&#26377;&#20851;&#31995;</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;">&#20135;&#29983; 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;">&#33258; PHP 5.3.0 &#36215;</span>

    后期绑定, 又叫延迟绑定

    延迟绑定的意思, 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, &#22240;&#20026;&#25191;&#34892;&#29615;&#22659;&#21464;&#25104;&#20102; parent</span><span style="color: #7fffd4;">Sun</span>::say2();                    <span style="color: #ff7f24;">// </span><span style="color: #ff7f24;">sun, &#20445;&#25345;&#38745;&#24577;</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;">&#31105;&#27490;&#32487;&#25215;&#30340;&#31867;&#20462;&#25913;&#33258;&#36523;, &#20063;&#21487;&#20197;&#20351;&#29992; 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>

    魔术方法

    1. __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, &#22914;&#26524;&#23384;&#22312;&#19981;&#20250;&#35843;&#29992; &#39764;&#26415;&#26041;&#27861;</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;">&#19981;&#33021;&#35843;&#29992;, &#35843;&#29992;&#39764;&#26415;&#26041;&#27861;</span>
    2. __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;">&#21487;&#20197;&#35774;&#32622;</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>
    3. __isset
      class test {    public function __isset($v) {        return false;        .....        return true;    }}
      $t = new test();if (isset($t->value)) {    echo 'isset';} else {    echo 'noset';}
    4. __unset
      调用的属性不存在, 就会调用此函数, 主要用于友好操作
    5. __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>();
      <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>
    6. __callStatic
      public static function  __callStatic ( $name ,  $arguments ) { ... }
    7. 重载 覆盖

      覆盖: override 指的是子类覆盖父类的方法, 在 PHP 中, 如果 子类和父类的参数不一样会有警告
      重载: redeclare 指的是同一个类中包含两个相同名字的方法, 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() {     ...   }}
      1. 继承类必须实现抽象类的 所有 方法
      2. 抽象类可以有自己的属性
      3. 抽象类可以有自己的实现方法, 也叫具体方法, interface 没有
      4. 可以有 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 {}
      1. 继承类要实现 接口的全部方法
      2. interface 不能有 private 的方法
      3. interface 里面的属性只能是 常量
      4. interface 里面不能实现方法, 抽象类可以, (可以理解接口里面全都是抽象方法)
      5. 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. 如果要创建一个模型, 这个模型将由一些紧密的对象采用, 就可以使用抽象类. 如果要创建由一些不相关对象采用的功能, 使用接口
      2. 如果必须从多个来源继承行为, 就使用接口. 接口可以实现多个, 不可以继承多个抽象类
      3. 如果所有的类会有共享一个公共的行为实现, 就使用抽象类, 并在其中的实现该行为, 在接口中无法实现具体方法

      命名空间

      如果文件 1 有 test 对象, 文件 2 也有 test 对象
      在文件 3

      require '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;"># &#20063;&#21487;&#20197;&#20351;&#29992;&#21035;&#30340;&#21629;&#21517;&#31354;&#38388; ...\...\...\...</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;">&#33258;&#21160;&#20250;&#35843;&#29992;&#19978;&#38754;&#30340;&#21738;&#20010;&#20989;&#25968;, &#21442;&#25968;&#21517;&#26159; 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;">&#33258;&#21160;&#20250;&#35843;&#29992;&#19978;&#38754;&#30340;&#21738;&#20010;&#20989;&#25968;, &#21442;&#25968;&#21517;&#26159; 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;">&#19968;&#23450;&#35201;&#20808;&#35843;&#29992;</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 函数

Déclaration:
Le 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.cn
Article précédent:php利用递归函数实现无限级归类Article suivant:Yii2.0中文开发指引——Where条件查询全解析

Articles Liés

Voir plus