目次
__set_state and __invoke" >__set_state and __invoke
ホームページ バックエンド開発 PHPチュートリアル PHPマジック関数の学習と応用 _construct() _destruct() _get() など

PHPマジック関数の学習と応用 _construct() _destruct() _get() など

Jun 13, 2016 pm 01:02 PM
autoload class echo function test

PHPマジック関数の学習と応用 __construct() __destruct() __get() など

(1) マジックメソッドの最初の紹介
Php5.0 のリリース以来、Php5.0 は オブジェクト? 用の多くの機能、特に多くの使いやすいマジックを提供してきました。これらの魔法のメソッドを使用すると、コーディングが簡素化され、システムの設計が向上します。今日はphp5.0が提供するマジックメソッドについて学びます。

1, __construct() オブジェクトをインスタンス化するとき、最初にオブジェクトのこのメソッドが呼び出されます。

<span style="background-color: #ffffff;">class Test
{
function __construct()

{
echo "before";
}
}

$t = new Test();</span>
ログイン後にコピー

?
出力は次のとおりです:

start



<span style="background-color: #ffffff;"><?
class Test
{
    function Test()
{
echo "end2";
}
function __construct()
{
echo "end";
}

}
$t = new Test();</span>
ログイン後にコピー
?

//出力終了


php5 オブジェクト モデル?はクラスと同じ名前を持っています。関数?はclassFunction ? のコンストラクターfunction ? と __construct() メソッドの両方を定義すると、php5 はコンストラクター function ? を呼び出します。デフォルトであり、同じ名前 Function? を呼び出すことはないため、__construct() はクラスFunction?

< のデフォルトのコンストラクターとして機能します。 🎜>
2,__destruct() when このメソッドは、オブジェクトが削除されたとき、またはオブジェクトの操作が終了したときに呼び出されます。

<span style="background-color: #ffffff;">class Test
{
function __destruct()
{
echo "end";
}
}
$t = new Test();</span>
ログイン後にコピー

?

end


を出力します。操作を実行できますオブジェクト操作

3 の最後にリソースを解放するなど、存在しない属性を読み取ろうとすると __get() が呼び出されます。
オブジェクトに存在しないプロパティを読み取ろうとすると、PHP はエラー メッセージを表示します。クラスに __get メソッドを追加すると、この 関数 を使用して、Java のリフレクションと同様のさまざまな操作を実装できるでしょうか。

<span style="background-color: #ffffff;">class Test
{
public function __get($key)
{
echo $key . " 不存在";
}
}

$t = new Test();
echo $t->name;</span>
ログイン後にコピー

?
は次のように出力します:
name は存在しません

4,__set() は、存在しないプロパティに値を書き込もうとするときに呼び出されます。

<span style="background-color: #ffffff;">class Test
{
public function __set($key,$value)
{
echo '对'.$key . "附值".$value;
}
}


$t = new Test();
$t->name = "aninggo";</span>
ログイン後にコピー

?
は次の出力を行います:
append value to name aninggo


5,__call() に存在しないメソッドを呼び出そうとすると、オブジェクトがある場合は、このメソッドを呼び出します。

<span style="background-color: #ffffff;">class Test
{
public function __call($Key, $Args)
{
echo "您要调用的 {$Key} 方法不存在。你传入的参数是:" . print_r($Args, true);
}
}

$t = new Test();
$t->getName(aning,go);</span>
ログイン後にコピー

?

プログラムは次のように出力します:
呼び出したい getName メソッドは存在しません。パラメータは次のとおりです: Array
(
[0] => aning
[1] => go
)

6,__toString() は、 がオブジェクトを出力するときに呼び出されますこのメソッドは、Java の toString メソッドに似ています。オブジェクトを直接出力し、この
関数を呼び出します ?

<span style="background-color: #ffffff;">class Test
{
public function __toString()
{
return "打印 Test";
}
}

$t = new Test();

echo $t; </span>
ログイン後にコピー

?
echo $t; を実行すると、$t->toString(); が呼び出され、
Print Test

7,__clone( ) が出力されます。オブジェクトが複製されるときに呼び出されます

<span style="background-color: #ffffff;">class Test
{

public function __clone()
{
echo "我被复制了!";
}
}

$t = new Test();
$t1 = clone $t;</span>
ログイン後にコピー

?
プログラム出力:
クローンが作成されました!


__sleep 和 __wakeup



串行化serialize可以把变量包括对象,转化成连续bytes数据. 你可以将串行化后的变量存在一个文件里或在网络上传输. 然后再反串行化还原为原来的数据. 你在反串行化类的对象之前定义的类,PHP可以成功地存储其对象的属性和方法. 有时你可能需要一个对象在反串行化后立即执行. 为了这样的目的,PHP会自动寻找__sleep和__wakeup方法.

  当一个对象被串行化,PHP会调用__sleep方法(如果存在的话). 在反串行化一个对象后,PHP 会调用__wakeup方法. 这两个方法都不接受参数. __sleep方法必须返回一个数组,包含需要串行化的属性. PHP会抛弃其它属性的值. 如果没有__sleep方法,PHP将保存所有属性.

  例子6.16显示了如何用__sleep和__wakeup方法来串行化一个对象. Id属性是一个不打算保留在对象中的临时属性. __sleep方法保证在串行化的对象中不包含id属性. 当反串行化一个User对象,__wakeup方法建立id属性的新值. 这个例子被设计成自我保持. 在实际开发中,你可能发现包含资源(如图像或数据流)的对象需要这些方法

<span style="background-color: #ffffff;">Object serialization
CODE: [Copy to clipboard]
--------------------------------------------

<?php 

class User 
{ 
public $name; 
public $id; 

function __construct() 
{ 
//give user a unique ID 赋予一个不同的ID 
$this->id = uniqid(); 
} 

function __sleep() 
{ 
//do not serialize this->id 不串行化id 
return(array("name")); 
} 

function __wakeup() 
{ 
//give user a unique ID 
$this->id = uniqid(); 
} 
} 

//create object 建立一个对象 
$u = new User; 
$u->name = "Leon"; 

//serialize it 串行化 注意不串行化id属性,id的值被抛弃 
$s = serialize($u); 

//unserialize it 反串行化 id被重新赋值 
$u2 = unserialize($s); 

//$u and $u2 have different IDs $u和$u2有不同的ID 
print_r($u); 
print_r($u2); 
?></span>
ログイン後にコピー
?


__set_state and __invoke


测试代码如下:


<span style="background-color: #ffffff;"><?php
class A {
public static function __set_state($args)
 {
        $obj = new A();
        foreach($args as $k=>$v)
        {
             $obj->$k = $v;
        }
        return $obj;
    }

}
$a = new A;
$a->name = 'cluries';
$a->sex = 'female';
eval('$b = ' . var_export($a, true) . ';');
print_r($b);
?></span>
ログイン後にコピー
??

程序输出

<span style="background-color: #ffffff;">object(A)#2 (2) {
         ["name"]=>  string(7) "cluries"
         ["sex"]=>  string(6) "female"
}
</span>
ログイン後にコピー

得出以下结论,__set_state作用是用来复制一个对象,并且可以在__set_state中定义在复制对象的时候对复制得到的对象进行一些 改变。和__clone不同的是__set_state可以接受参数,__set_state使用起来更加强大!虽然个人觉得这个东西不是很好用= =!



然后再说下__invoke:
手册上有个非常显眼的:Note: This feature is available since PHP 5.3.0.?

<span style="background-color: #ffffff;">The __invoke method is called when a script tries to call an object as a function.
</span>
ログイン後にコピー

__invoke方法将会在代码试图把对象当作函数来使用时候调用?有点稀奇,这个功能有什么用处呢?
然后看下提供的例子:


<span style="background-color: #ffffff;"><?php
class CallableClass 
{
   function __invoke($x)
   {
        var_dump($x);
}
   }

$obj = new CallableClass;
$obj(5);
var_dump(is_callable($obj));
?>
</span>
ログイン後にコピー
?


程序输出:

<span style="background-color: #ffffff;">int(5)
bool(true)
</span>
ログイン後にコピー

还真是把对象当函数使用…


__autoload



PHP5中有一方法: __autoload() , 简单的说就是类的自动加载;

当你尝试使用一个PHP没有组织到的类, 它会寻找一个__autoload的全局函数. 如果存在这个函数,PHP会用一个参数来调用它,参数即类的名称。

那么简单测试一下。


首先建一个名为”Test_autoload.php”的文件:


<span style="background-color: #ffffff;">< ? php
/**
* 测试__autoload方法
*
*/
class Test_autoload {
public function __construct () {
echo " Test_autoload. " ;
}
}
?></span>
ログイン後にコピー
?

注意类名哦?, 然后随便建个文件重写 __autoload() 方法,这里假设是”test.php”;


<span style="background-color: #ffffff;">< ? php
/**
* 重写 __autoload方法
*/
function __autoload ( $class ) {
include $class . ' .php ' ;
}

$test = new Test_autoload () ;
unset ( $test ) ;
?></span>
ログイン後にコピー
?

最后结果为:Test_autoload.



------------------------------------------------
8.顺便介绍下php5中提供的几个非常COOl的实验性函数?
(1)。runkit_method_rename
??? 这个函数?可以动态的改变我们所调用的函数?的名字?。

<span style="background-color: #ffffff;">class Test
{

function foo() {
        return "foo! ";
    }

}

runkit_method_rename(
    'Test', //类名
    'foo',//实际调用的函数 
    'bar'//显示调用的函数 
);

echo Test::bar();</span>
ログイン後にコピー

?

程序将输出
 
foo!

(2) runkit_method_add

这个函数?可以动态的向类中添加函数?


<span style="background-color: #ffffff;">class Test
{

function foo() {
        return "foo! ";
    }

}

runkit_method_add(
    Test, //类名
    'add', //新函数 名
    '$num1, $num2',//传入参数
    'return $num1 + $num2;',//执行的代码
    RUNKIT_ACC_PUBLIC
);

// 调用
echo $e->add(12, 4);
</span>
ログイン後にコピー

?

(3)runkit_method_copy
可以把A类中的函数?拷贝到类B中并对函数?重命名


<span style="background-color: #ffffff;">class Foo {
    function example() {
        return "foo! ";
    }
}

class Bar {
    //空类
}

//执行拷贝
runkit_method_copy('Bar', 'baz', 'Foo', 'example');

//执行拷贝后的函数 
echo Bar::baz();
</span>
ログイン後にコピー

?

(4) runkit_method_redefine
动态的修改函数?的返回值
这个函数?可以让我们轻松的实现对类的MOCK测试!是不是很COOL呢


<span style="background-color: #ffffff;">class Example {
    function foo() {
        return "foo! ";
    }
}

//创建一个测试对象
$e = new Example();

// 在测试对象之前输出
echo "Before: " . $e->foo();

// 修改返回值
runkit_method_redefine(
    'Example',
    'foo',
    '',
    'return "bar! ";',
    RUNKIT_ACC_PUBLIC
);

// 执行输出
echo "After: " . $e->foo();</span>
ログイン後にコピー

?


(5)runkit_method_remove
这个函数?就很简单了,看名字?就能看出来了,动态的从类中移除函数?

<span style="background-color: #ffffff;">class Test {
    function foo() {
        return "foo! ";
    }
   
    function bar() {
        return "bar! ";
    }
}

// 移除foo函数 
runkit_method_remove(
    'Test',
    'foo'
);

echo implode(' ', get_class_methods('Test'));</span>
ログイン後にコピー

?

程序输出
bar

?

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Huawei Watch GT 5スマートウォッチが新機能を追加してアップデートされる Huawei Watch GT 5スマートウォッチが新機能を追加してアップデートされる Oct 03, 2024 am 06:25 AM

ファーウェイは、Watch GT 5 および Watch GT 5 Pro スマートウォッチ用のソフトウェア バージョン 5.0.0.100(C00M01) をグローバルに展開しています。これら 2 つのスマートウォッチは最近ヨーロッパで発売され、標準モデルが同社の最も安価なモデルとして登場しました。このハーモニー

鉄拳のカーネル・サンダースの夢をKFCが揚げた 鉄拳のカーネル・サンダースの夢をKFCが揚げた Oct 02, 2024 am 06:07 AM

『鉄拳』シリーズのディレクターである原田勝弘氏は、かつて真剣にカーネル・サンダースを象徴的な格闘ゲームに登場させようとした。 TheGamerとのインタビューで原田氏は、このアイデアを日本KFCに売り込み、ファストフード界のレジェンドをGとして追加したいと考えていたことを明かした。

初見:次期 Anker Zolo 4 ポート 140W ディスプレイ付き充電器の開封ビデオが流出 初見:次期 Anker Zolo 4 ポート 140W ディスプレイ付き充電器の開封ビデオが流出 Oct 01, 2024 am 06:32 AM

2024年9月初め、AnkerのZolo 140W充電器がリークされました。これは同社初のディスプレイ付き壁掛け充電器だったため、大きな話題になりました。 YouTube の Xiao Li TV からの新しい開封ビデオでは、この製品を直接見ることができます。

HyperOS を搭載した新しい Xiaomi Mijia グラフェン オイル ヒーターが到着 HyperOS を搭載した新しい Xiaomi Mijia グラフェン オイル ヒーターが到着 Oct 02, 2024 pm 09:02 PM

Xiaomiは間もなくMijiaグラフェンオイルヒーターを中国で発売する予定です。同社は最近、Youpin プラットフォームでホストされるスマート ホーム製品のクラウドファンディング キャンペーンを実施し、成功を収めました。ページによると、デバイスはすでに出荷され始めています

Samsung Galaxy Z Fold Special Edition、競合する名前が浮上、10月下旬に発売されることが判明 Samsung Galaxy Z Fold Special Edition、競合する名前が浮上、10月下旬に発売されることが判明 Oct 01, 2024 am 06:21 AM

サムスンの待望の折りたたみ式「スペシャルエディション」の発売には、また新たな展開が加わった。ここ数週間、いわゆる Galaxy Z Fold Special Edition に関する噂はかなり静かになりました。代わりに、焦点はGalaxy S25シリーズに移りました。

Garmin、新しいアップデートにより複数のスマートウォッチ向けの Adventure Racing アクティビティの改善をリリース Garmin、新しいアップデートにより複数のスマートウォッチ向けの Adventure Racing アクティビティの改善をリリース Oct 01, 2024 am 06:40 AM

Garmin は、最新のハイエンド スマートウォッチの新しい安定したアップデートのセットで月末を迎えます。要約すると、同社は Enduro 3、Fenix E、および Fenix 8 のバッテリー消耗の多さに対処するためにシステム ソフトウェア 11.64 をリリースしました (Amazon で現在 1,099.99 ドル)。

Cyber​​truck FSD のレビューでは、素早いレーン切り替えと全画面視覚化が賞賛されています Cyber​​truck FSD のレビューでは、素早いレーン切り替えと全画面視覚化が賞賛されています Oct 01, 2024 am 06:16 AM

テスラは最新の完全自動運転 (監視付き) バージョン 12.5.5 を展開しており、これには、ファウンデーション シリーズのトリム価格に含まれる機能を備えたピックアップが発売されてから 10 か月後に、約束されていたサイバートラック FSD オプションがついに付属します。 F

Manjaro 24.1「Xahea」は、KDE ​​Plasma 6.1.5、VirtualBox 7.1 などとともに起動します Manjaro 24.1「Xahea」は、KDE ​​Plasma 6.1.5、VirtualBox 7.1 などとともに起動します Oct 02, 2024 am 06:06 AM

10 年以上の歴史を持つ Manjaro は、インストールと使用が簡単で、初心者とパワーユーザーの両方に適した最もユーザーフレンドリーな Linux ディストリビューションの 1 つとみなされています。主にオーストリア、ドイツ、フランスで開発されたこの Arch ベースのディストリビューション

See all articles