ホームページ > バックエンド開発 > PHPチュートリアル > PHP でのマジック メソッドとマジック定数の使用の概要

PHP でのマジック メソッドとマジック定数の使用の概要

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
リリース: 2016-06-20 13:03:12
オリジナル
1344 人が閲覧しました

魔法のメソッド

PHP では、2 つのアンダースコア __ で始まるメソッドをマジック メソッドと呼びます。これらのメソッドは、PHP において決定的な役割を果たします。 魔法のメソッドは次のとおりです:

  • __construct()、クラスコンストラクター

  • __destruct()、クラスのデストラクター

  • __call()、オブジェクト内のアクセスできないメソッドを呼び出すときに呼び出されます

  • __callStatic()、静的モードでアクセスできないメソッドを呼び出すときに呼び出されます

  • __get()、クラス

    のメンバー変数を取得するときに呼び出されます。
  • __set()、クラス

    のメンバー変数を設定するときに呼び出されます。
  • __isset()、アクセスできないプロパティに対して isset() または empty() が呼び出されたときに呼び出されます

  • __unset()。アクセスできないプロパティに対して unset() が呼び出されたときに呼び出されます。

  • __sleep()、serialize() を実行すると、この関数が最初に呼び出されます

  • __wakeup()、unserialize() を実行すると、この関数が最初に呼び出されます

  • __toString()、クラスが文字列として扱われる場合の応答メソッド

  • __invoke()、関数を呼び出してオブジェクトを呼び出すときの応答メソッド

  • __set_state()、この静的メソッドは、クラスをエクスポートするために var_export() を呼び出すときに呼び出されます。

  • __clone()、オブジェクトのコピーが完了すると呼び出されます

__construct() および __destruct()

コンストラクターとデストラクターはよく知られているはずです。これらはオブジェクトの作成時と破棄時に呼び出されます。たとえば、ファイルを開き、オブジェクトが作成されたときにファイルを開き、オブジェクトが消滅したときにファイルを閉じる必要があります

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

class FileRead

 

{

protected $handle = NULL;

function __construct(){

 

$this->handle = fopen(...);

 

}

 

function __destruct(){

 

fclose($this->handle);

 

}

 

}

 

?>

ログイン後にコピー

これら 2 つのメソッドは、継承時に拡張できます。たとえば、

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

class TmpFileRead extends FileRead

 

{

 

function __construct(){

 

parent::__construct();

 

}

 

function __destruct(){

 

parent::__destruct();

 

}

 

}

 

?>

ログイン後にコピー

__call() および __callStatic()

これら 2 つのメソッドは、オブジェクト内でアクセスできないメソッドが呼び出されたときに呼び出されます。後者は静的メソッドです。これら 2 つのメソッドは、変数メソッド (変数関数) 呼び出しで使用できます。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

class MethodTest

{

 

public function __call ($name, $arguments) {

 

echo "Calling object method '$name' ". implode(', ', $arguments). "\n";

 

}

 

public static function __callStatic ($name, $arguments) {

 

echo "Calling static method '$name' ". implode(', ', $arguments). "\n";

 

}

 

}

 

$obj = new MethodTest;

 

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

 

MethodTest::runTest('in static context');

 

?>

ログイン後にコピー

__get()、__set()、__isset()、__unset()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

class MethodTest

{

 

private $data = array();

 

public function __set($name, $value){

 

$this->data[$name] = $value;

 

}

 

public function __get($name){

 

if(array_key_exists($name, $this->data))

 

return $this->data[$name];

 

return NULL;

 

}

 

public function __isset($name){

 

return isset($this->data[$name])

 

}

 

public function unset($name){

 

unset($this->data[$name]);

 

}

 

}

 

?>

ログイン後にコピー

__sleep() と __wakeup()

serialize() と unserialize() を実行すると、これら 2 つの関数が最初に呼び出されます。たとえば、オブジェクトをシリアル化する場合、そのオブジェクトにはデータベース リンクが含まれており、逆シリアル化中にリンク状態を復元したい場合は、これら 2 つの関数を再構築することでリンクを復元できます。例は次のとおりです。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

class Connection

{

protected $link;

 

private $server, $username, $password, $db;

 

public function __construct($server, $username, $password, $db)

 

{

 

$this->server = $server;

 

$this->username = $username;

 

$this->password = $password;

 

$this->db = $db;

 

$this->connect();

 

}

 

private function connect()

 

{

 

$this->link = mysql_connect($this->server, $this->username, $this->password);

 

mysql_select_db($this->db, $this->link);

 

}

 

public function __sleep()

 

{

return array('server', 'username', 'password', 'db');

}

 

public function __wakeup()

 

{

$this->connect();

}

}

?>

ログイン後にコピー

__toString()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

// Declare a simple class

 

class TestClass

 

{

public function __toString() {

 

return 'this is a object';

 

}

 

}

 

$class = new TestClass();

 

echo $class;

 

?>

ログイン後にコピー

このメソッドは文字列のみを返すことができ、このメソッドで例外をスローすることはできません。スローしないと致命的なエラーが発生します。

__invoke()

関数呼び出しでオブジェクトを呼び出す際のレスポンスメソッド。以下の通り

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

class CallableClass

 

{

 

function __invoke() {

 

echo 'this is a object';

 

}

 

}

 

$obj = new CallableClass;

 

var_dump(is_callable($obj));

 

?>

ログイン後にコピー

__set_state()

この静的メソッドは、クラスをエクスポートするために var_export() を呼び出すときに呼び出されます。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

class A

{

 

public $var1;

 

public $var2;

 

public static function __set_state ($an_array) {

 

$obj = new A;

 

$obj->var1 = $an_array['var1'];

 

$obj->var2 = $an_array['var2'];

 

return $obj;

 

}

 

}

 

$a = new A;

 

$a->var1 = 5;

 

$a->var2 = 'foo';

 

var_dump(var_export($a));

 

?>

ログイン後にコピー

__clone()

オブジェクトのコピーが完了すると呼び出されます。例えば、記事「デザインパターンとPHP実装の詳細解説:シングルトンモード」で紹介したシングルトンモードの実装方法では、オブジェクトの複製を防ぐためにこの機能が使用されています。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

public class Singleton {

 

private static $_instance = NULL;

 

 

// 私有构造方法

 

private function __construct() {}

 

 

public static function getInstance() {

 

if (is_null(self::$_instance)) {

 

self::$_instance = new Singleton();

 

}

 

return self::$_instance;

 

}

 

// 防止克隆实例

 

public function __clone(){

 

die('Clone is not allowed.' . E_USER_ERROR);

 

}

 

}

 

?>

ログイン後にコピー

魔法定数

PHP の定数のほとんどは変更されませんが、コード内の位置が変わると変更される定数が 8 つあり、これらの 8 つの定数はマジック定数と呼ばれます。

  • __LINE__、ファイル内の現在の行番号

  • __FILE__、ファイル

    の完全なパスとファイル名
  • __DIR__、ファイルが配置されているディレクトリ

  • __FUNCTION__、関数名

  • __CLASS__、クラスの名前

  • __TRAIT__、トレイトの名前

  • __METHOD__、クラスメソッド名

  • __NAMESPACE__、現在の名前空間の名前

これらのマジック定数は、現在の環境情報を取得したり、ログを記録したりするためによく使用されます。


関連ラベル:
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
関連するチュートリアル
人気のおすすめ
最新のコース
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート