php オブジェクト指向 (5)

WBOY
WBOYオリジナル
2016-08-08 09:19:23797ブラウズ

1. 復習: 前回の記事では、抽象クラス、インターフェイス、特性について学びました

2. この記事では、オーバーロードについて学びます。

3. オーバーロード: マジック メソッドを使用して実現します

3.1 概要

      (1)php中的重载是指动态的创建类属性和方法
      (2)当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用
      (3)所有的重载方法都必须声明为 public
      (4)通过魔术方法的参数都不能通过引用传递
      (5)和传统的面向对象重载不同
      (6)传统的重载是用于提供多个同名类方法,各方法参数类型和个数不同
      (7)isset() 和 unset()  魔术方法
      (8)callStatic() php5.3
  3.2属性重载
e
   演示一个例子:
<pre name="code">       # __set __get __isset ,__unset
     class MemberTest {
      /**  被重载的数据保存在此  */
    private $data = array();

 
    /**  重载不能被用在已经定义的属性  */
    public $declared = 1;

       /**  只有从类外部访问这个属性时,重载才会发生 */
    private $hidden = 2;

    public function __set($name, $value) {
        echo "Setting '$name' to '$value' ";
        $this->data[$name] = $value;
    }

    public function __get($name) {
        echo "Getting '$name' ";
        if (array_key_exists($name, $this->data)) {
            return $this->data[$name];
        }

        $trace = debug_backtrace();
        trigger_error(
            'Undefined property via __get(): ' . $name .
            ' in ' . $trace[0]['file'] .
            ' on line ' . $trace[0]['line'],
            E_USER_NOTICE);
        return null;
    }

    /**  PHP 5.1.0之后版本 */
    public function __isset($name) {
        echo "Is '$name' set? ";
        return isset($this->data[$name]);
    }

    /**  PHP 5.1.0之后版本 */
    public function __unset($name) {
        echo "Unsetting '$name' ";
        unset($this->data[$name]);
    }

    /**  非魔术方法  */
    public function getHidden() {
        return $this->hidden;
    }
}


echo "<pre class="brush:php;toolbar:false"> ";

$obj = new MemberTest;

$obj->a = 1;
echo $obj->a . " ";

var_dump(isset($obj->a));
unset($obj->a);
var_dump(isset($obj->a));
echo " ";

echo $obj->declared . " ";

echo "Let's experiment with the private property named 'hidden': ";
echo "Privates are visible inside the class, so __get() not used... ";
echo $obj->getHidden() . " ";
echo "Privates not visible outside of class, so __get() is used... ";
echo $obj->hidden . " ";
       
3.3 メソッドのオーバーロード

  演示一个例子:

オーバーロードは少し理解しにくいです。練習が必要です!

著作権声明: この記事はブロガーによるオリジナルの記事であり、ブロガーの許可なく複製することはできません。

以上、php オブジェクト指向 (5) について内容の側面も含めて紹介しましたが、PHP チュートリアルに興味のある友人の参考になれば幸いです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。