ホームページ  >  記事  >  バックエンド開発  >  PHP オブジェクト指向プログラミング - 特別演習 DAY 4

PHP オブジェクト指向プログラミング - 特別演習 DAY 4

WBOY
WBOYオリジナル
2016-07-29 09:15:05855ブラウズ
オブジェクト指向特別な実践
(PHP でのみ使用可能、他の言語はオブジェクト指向ではありません)
オブジェクト指向 -- 魔法のメソッド __construct()、__destruct() コンストラクターとデストラクター
__tostring ()
__invoke()
__call(), __callStatic()
__get(), __set(), __isset(), __unset()
__clone()
__tostring()
オブジェクト
を文字列として使用する場合、このメソッドは自動的に呼び出されます。 Echo $obj;__invoke()

object
がメソッドとして呼び出されるとき、このメソッドは自動的に呼び出されます$obj(4);

<?php

class MagicTest{

	//__tostring会在把<strong>对象</strong>转换为string的时候自动调用
	public function __tostring(){
		return "This is the Class MagicTest. ";
	}

	// __invoke会在把<strong>对象</strong>当作一个方法调用的时候自动调用
	public function __invoke($x){
		echo "__invoke called with parameter ".$x."\n";
	}
}

$obj = new MagicTest();
echo $obj."\n";
$obj(5);

?>


output:

これはクラスMagicTestです。

__invoke はパラメーター 5 で呼び出されます


__call()

オブジェクト
が存在しないメソッド名にアクセスすると、__call() メソッドが自動的に呼び出されます __callStatic()
オブジェクト
が存在しないメソッド名にアクセスする場合静的メソッド 名前 いつ さまざまな方法で実装可能

<?php

class MagicTest{

	public function __tostring(){
		return "This is the Class MagicTest. ";
	}

	public function __invoke($x){
		echo "__invoke called with parameter ".$x."\n";
	}

	//方法的重载
	//这个方法的参数第一个就是调用的方法的名称,第二个参数是方法调用的参数组成的数组
	public function __call($name,$arguments){
		echo "Calling " . $name . " with parameters: ".
			implode(",", $arguments)."\n";

	}

	//<strong>静态方法</strong>的重载,注意这个方法需要设定为static
	public static function __callStatic($name,$arguments){
		echo "Static Calling " . $name . " with parameters: ".
			implode(",", $arguments)."\n";

	}
}

$obj = new MagicTest();

//runTest这两个方法的名称本来不能完全相同,但是通过魔术方法,可以调用了
$obj->runTest("para1","para2"); //没有声明这个runTest方法,因为有__call这个魔术方法,也可以被调用
MagicTest::runTest("para1","para2"); //没有声明这个runTest方法,因为有__callStatic这个魔术方法,也可以被调用

?>


出力:
パラメータを指定して runTest を呼び出す: para1、para2
パラメータを指定して runTest を静的に呼び出す: para1、para2


__get(), __set(), __isset()、__unset()
アクセスできないプロパティに値を代入する場合、__set()が呼び出されます
アクセスできないプロパティの値を読み取る場合、__get()が呼び出されます

isset()またはempty()を呼び出す場合アクセスできないプロパティ、__isset() が呼び出されます

アクセスできない属性に対して unset() が呼び出される場合、__unset() が呼び出されます
いわゆるアクセスできない属性とは、実際には、特定の属性を呼び出すときに、その属性が現時点では、異なる操作によって異なるマジック メソッドがトリガーされます
これらのメソッドは、プロパティ オーバーロードのマジック メソッドとも呼ばれます



<?php

class MagicTest{

	public function __tostring(){
		return "This is the Class MagicTest. ";
	}

	public function __invoke($x){
		echo "__invoke called with parameter ".$x."\n";
	}

	//方法的重载
	//这个方法的参数第一个就是调用的方法的名称,第二个参数是方法调用的参数组成的数组
	public function __call($name,$arguments){
		echo "Calling " . $name . "with parameters: ".
			implode(",", $arguments)."\n";

	}

	//<strong>静态方法</strong>的重载,注意这个方法需要设定为static
	public static function __callStatic($name,$arguments){
		echo "Static Calling " . $name . "with parameters: ".
			implode(",", $arguments)."\n";

	}

	//属性重载
	public function __get($name){
		return "Getting the property ".$name."\n";
	}

	public function __set($name, $value){
		echo "Setting the property ".$name." to value " . $value."\n";
	}

	public function __isset($name){
		echo "__isset invoked\n";
		return true;
	}

	public function __unset($name){
		echo "unsetting property ".$name."\n";
	}
}

$obj = new MagicTest();
echo $obj->className."\n"; //className未定义,但是通过魔术方法__get,这个方法好像被定义了一样
$obj->className='MagicClassX'; //通过魔术方法__get将className名称定义为MagicClassX
echo '$obj->name is set?'.isset($obj->className)."\n";
echo '$obj->name is empty?'.empty($obj->className)."\n";
unset($obj->className);
?>

出力:
プロパティ className の取得プロパティ className の値を MagicClassX に設定

__isset が呼び出されます。
$obj-> name is set?1 //return が true の場合、結果は 1 として表示されます
__isset が呼び出されました
$obj->name is empty? / /return が true の場合、結果は空として表示されます。return が false の場合、結果は 1 として表示されます。 http://image.codes51.com/Article /image/20150919/20150919094729_4892.jpg" alt="PHP オブジェクト指向
プログラミング - 特別演習 4 日目">

<?php

class NbaPLayer{
	public $name;
	function __clone(){
		$this->name='TBD'; //屏蔽你不想要他复制过去的数据,屏蔽掉他的数据,设置他的初始值
	}
}

$james = new NbaPlayer();
$james->name = 'James';
echo $james->name."\n";
$james2 = clone $james;
echo "Before set up: James2's: ".$james2->name."\n";
$james2->name='James2';
echo "James's: ".$james->name;
echo "James's: ".$james2->name;

?>

出力:
James
セットアップ前: James2 の: 未定
James: JamesJames2 //James2 のデータは James のデータには影響しません

---------------------------- ------------------ -------------------------------- --------PHP オブジェクト指向 プログラミングノートはこれで完了です。 ------------------- ------------------------------- -

以上は、PHP オブジェクト指向プログラミング - 特別演習 DAY 4 の内容の側面を含めた入門であり、PHP チュートリアルに興味のある友人にとって役立つことを願っています。 PHP面向<strong>
                </strong>
                    </p>

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