Heim >Backend-Entwicklung >PHP-Tutorial >PHP-objektorientiert (5)

PHP-objektorientiert (5)

WBOY
WBOYOriginal
2016-08-08 09:19:23798Durchsuche

1. Rückblick: Ich habe im vorherigen Artikel etwas über abstrakte Klassen, Schnittstellen und Eigenschaften gelernt

2. In diesem Artikel werde ich etwas über Überladung lernen!

3. Überladung: Verwenden Sie die magische Methode zur Implementierung

3.1 Zusammenfassung

      (1)php中的重载是指动态的创建类属性和方法
      (2)当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用
      (3)所有的重载方法都必须声明为 public
      (4)通过魔术方法的参数都不能通过引用传递
      (5)和传统的面向对象重载不同
      (6)传统的重载是用于提供多个同名类方法,各方法参数类型和个数不同
      (7)isset() 和 unset()  魔术方法
      (8)callStatic() php5.3
  3.2属性重载
   演示一个例子:
<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 Methodenüberladung 
  演示一个例子:
<pre name="code">  #__call , __callStatic
class MethodTest {
    public function __call($name, $arguments) {
        // 注意: $name 区分大小写
        echo "Calling object method '$name' "
             . implode(', ', $arguments). " ";
    }

    /**  PHP 5.3.0之后版本  */
    public static function __callStatic($name, $arguments) {
        // Note: value of $name is case sensitive.
        echo "Calling static method '$name' "
             . implode(', ', $arguments). " ";
    }
}

$obj = new MethodTest;
$obj->runTest('in object context');

MethodTest::runTest('in static context');  // PHP 5.3.0之后版本

Überladung ist etwas schwer zu verstehen und erfordert Übung!

Urheberrechtserklärung: Dieser Artikel ist ein Originalartikel des Bloggers und darf nicht ohne die Erlaubnis des Bloggers reproduziert werden.

Das Obige stellt PHP-objektorientiert vor (5), einschließlich inhaltlicher Aspekte. Ich hoffe, dass es für Freunde hilfreich ist, die sich für PHP-Tutorials interessieren.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn