PHPオブジェクト向け特性

9996 ワード

PHP 5からオブジェクトモデルを完全に書き換え、より優れたパフォーマンスとより多くの特性を得る.本稿では,いくつかのPHPのオブジェクト向け特性を整理した.
1.クラスの属性(メンバー変数)
属性宣言は、キーワードpublic、protected、privateで始まり、通常の変数宣言で構成されます.ここでpublicはオブジェクトに直接アクセスできますが、他はできません.
属性宣言
クラス
サブクラス
public

×
protected


private

×
2.static静的属性
クラスのプロパティまたはメソッドが静的であることを宣言すると、クラスをインスタンス化せずに直接アクセスできます.静的プロパティは、クラスがインスタンス化されたオブジェクトからアクセスできません(静的メソッドは可能です).静的メソッドまたは変数はthiでアクセスできません.selfでアクセスする必要があります.
class A() {
    public static $my_static = 'foo'
    public static function static_func() {
        return self::$my_static;
    }
}
echo A::$my_static;
echo A::static_func();

4.クラス定数
クラスに定数を定義できます.定義方法はconst FOO = 'foo'です.1つのクラスにアクセスする定数は、selfキーワードを使用する必要があります.
class A {
    const FOO = 'foo';
    public static function foo() {
        return self::FOO;
    }
}
echo A::FOO;
echo A::foo();

5.コンストラクション関数と解析関数
1>コンストラクション関数を持つクラスは、新しいオブジェクトを作成するたびにコンストラクション関数を呼び出し、この関数を使用してオブジェクトの初期化操作を完了します.子クラスでコンストラクション関数が定義されている場合、親クラスのコンストラクション関数は暗黙的に呼び出されません.親クラスのコンストラクション関数を実行するには、サブクラスのコンストラクション関数でparent:_を呼び出す必要があります.construct().サブクラスがコンストラクション関数を定義していない場合は、privateとして定義されていない場合は、通常のクラスメソッドのように親から継承されます.Note:他の方法とは異なり、construct()は親に_されます.construct()が異なるパラメータを持つ方法で上書きする場合、PHPはE_を生成しません.STRICTエラーメッセージ.
class A {
    public function __construct() {
        echo "A de __construct()";
    }
}
class B extends A {
    public function __construct() {
        parent::__construct();
        echo "B de __construct()";
    }
}
$a = new A();
$b = new B();

2>コンストラクション関数は、オブジェクトへのすべての参照が削除されるか、オブジェクトが明示的に破棄されると実行されます.構造関数はexit()を使用してスクリプトの実行を終了しても呼び出されます.構造関数でexit()を呼び出すと、残りのクローズ操作の実行が中止されます.Note:構造関数はexit()を使用してスクリプトの実行を終了しても呼び出されます.構造関数でexit()を呼び出すと、残りのクローズ操作の実行が中止されます.
6.抽象クラス
クラスを定義するキーワードはabstractであり、抽象的なクラスはインスタンス化できないと定義される.いずれのクラスも、少なくとも1つのメソッドが抽象として宣言されている場合は、このクラスを抽象として宣言する必要があります.抽象的に定義されたメソッドは、呼び出し方式(パラメータ)を宣言するだけで、その具体的な機能実装を定義することはできません.抽象クラスを継承する場合、子クラスは親クラスのすべての抽象メソッドを定義する必要があります.さらに、これらのメソッドのアクセス制御は、親と同じ(またはより緩やか)でなければなりません.
6.インタフェースクラス
クラスを定義するキーワードinterfaceは、インタフェースを使用して、クラスが実装する必要があるメソッドを指定できますが、これらのメソッドの具体的な内容を定義する必要はありません.Note:クラスがインタフェースを実装するには、インタフェースで定義されている方法と完全に一致する方法を使用する必要があります.致命的なエラーが発生します.
7.マジックの方法
  • __set()アクセス不可属性に値を付与する場合、_set()が呼び出されます.
  • public void __set ( string $name , mixed $value )
  • __get()アクセス不可属性の値をとると、_get()が呼び出されます.
  • public mixed __get ( string $name )
  • __call()オブジェクトがアクセス不可能なメソッドを呼び出すと、_callメソッドは
  • に呼び出されます.
    public mixed __call ( string $name , array $arguments )
  • __toString()クラスが文字列として扱われると、メソッドが呼び出されます.
  • class Foo {
        public function __toString() {
            return __CLASS__;
        }
    }
    $foo = new Foo();
    echo $foo;
  • __invoke()関数を呼び出すようにオブジェクトを呼び出そうとすると、_invoke()メソッドが自動的に呼び出されます.
  • class Foo {
        public function __invoke($param) {
            var_dump($param);
        }
    }
    $foo = new Foo();
    $foo(5);
  • リロード(overloading)使用例
  • class PropertyTest {
         /**              */
        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 "

    "
    ;
    $obj = new PropertyTest;
    $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 . "";