欺瞞を防ぐための php __set __get __isset __unset の使用法分析
皆さん、こんにちは、Xiaoyan です。今日は、欺瞞を防ぐための PHP オブジェクト指向における __set __get __isset __unset の使用法について紹介します。 🎜>
全文注意=========================== ======== ==
__set __get __isset __unset これらのメソッドは古いバージョンの PHP では private に設定できますが、現在のphpバージョンではprivateに設定しない方が良いですが、staticメソッドに設定した場合は正常に値を返すことができますが、エラーが発生します。 警告 警告です! ! (php5.5バージョンを使用しています)
の始まりtext= =====================================
PHP オブジェクト指向では __set __get __isset __unset などの使用法をよく見かけますが、なぜこれらが使用されるのか理解できません。次にやってみましょう。兄弟の使い方を一つずつ紹介していきましょう。
一般的に言えば、クラス属性は常にプライベートとして定義され、これは現実的なロジックにより一致します。ただし、属性の読み取りと割り当ての操作は非常に頻繁に行われるため、PHP5 では、属性を取得して割り当てるための 2 つの関数「__get()」と「__set()」、および属性を確認するための「__isset」が事前定義されています。 )」と属性を削除するメソッド「__unset()」。
PHP5 では、値を設定するための特別なメソッドが提供されています。値を取得するメソッドは「__set()」と「__get()」の2つのメソッドです。この2つのメソッドはデフォルトでは存在せず、コンストラクタメソッド(__construct())と同様に手動でクラスに追加されます。 . は、クラスに追加された場合にのみ存在します。 もちろん、これら 2 つのメソッドは、
の方法で追加することもできます。public function __get($property_name){ if(isset($this->$property_name)){ return($this->$property_name); }else{ return(NULL); }}//__set()方法用来设置私有属性public function __set($property_name, $value){ $this->$property_name = $value;}__get () メソッド: このメソッドは、プライベート メンバー属性値を取得するために使用されます。パラメーターには、取得するメンバー属性の名前が渡されます。このメソッドをプライベート メソッドにすると、プライベート プロパティが直接取得されたときにオブジェクトによって自動的に呼び出されるため、このメソッドを手動で呼び出す必要はありません。 private プロパティはカプセル化されているため、値を直接取得することはできません (例: "echo $p1->name" を直接取得するのは誤りです)。ただし、このメソッドをクラスに追加する場合は、「 echo $p1->name" が値を直接取得すると、__get($property_name) メソッドが自動的に呼び出され、プロパティ名がパラメータ $property_name に渡されます。このメソッドの内部実行を通じて、渡したプライベート値が属性の値が返されます。メンバーのプロパティがプライベートとしてカプセル化されていない場合、オブジェクト自体はこのメソッドを自動的に呼び出しません。
基本的に __get() に関するインターネット上の記事の 99% がこれを述べていますが、私は が最も重要だとも言います。重要なのは、 __get() は 現在のクラス のプライベート メンバー変数を取得するだけでなく、インスタンス化などの他の操作もこのメソッドで実行できることです。別のクラスのオブジェクトを取得するには、別のクラスを使用します。 以下のコードを参照してください
public function __get($name) { return \Libs\Components::getInstance()->$name; }
这里 如果 获取name 并不是获取当前类的 私有属性 而且静态调用 Components类 里面的 $name 属性 所以 __get 方法一定要灵活运用 还有就是 __get() 方法不只是调用当前类的私有变量
public function __get($name) { if(isset($this->config[$name])) { return $this->config[$name]; } return null; }也还能这么用 指定 要获取的 变量!!
甚至 还能在类里面用 请看下面代码
class b { private $config = ['aa'=>'小烟']; public function __get($key) { if($this->config[$key]) return $this->config[$key]; } public function __construct() { echo $this->aa; } }$b = new b(); //输出 小烟
类里面 $this->bb 根本不存在 就会在类里面触发 __get 方法 返回config 里面的 aa 从而返回内容
__set()方法:这个方法也是用来获得你指定的变量 一般来讲都是获取类里面的私有变量,有两个参数,第一个参数为你要为设置值的属性名,第二个参数是要给属性设置的值,没有返回值。,
如果没有__set()这个方法,是不允许直接获取私有变量的,比如:$this->name='zhangsan', 这样会出错,但是如果你在类里面加上了__set($property_name, $value)这个方法,在直接给私有属性赋值的时候,就会自动调用它,把属性比如name传给$property_name, 把要赋的值"zhangsan"传给$value,通过这个方法的执行,达到赋值的目的。如果成员属性不封装成私有的,对象本身就不会去自动调用这个方法。为了不传入非法的值,还可以在这个方法给做一下判断。代码如下:
<?php class Person{ private $name; private $sex; private $age; private function __get($property_name){ echo "在直接获取私有属性值的时候,自动调用了这个__get()方法<br>"; if (isset($this->$property_name)) { return ($this->$property_name); } else { return null; } } private function __set($property_name, $value) { echo "在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值<br>"; $this->$property_name = $value; }}$p1 = new Person();$p1->name = "小烟";$p1->sex = "男";$p1->age = 23;echo "姓名:".$p1->name."<br>";echo "性别:".$p1->sex."<br>";echo "年龄:".$p1->age."<br>";
程序执行结果:
在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值在直接获取私有属性值的时候,自动调用了这个__get()方法姓名:小烟在直接获取私有属性值的时候,自动调用了这个__get()方法性别:男在直接获取私有属性值的时候,自动调用了这个__get()方法年龄:23
以上代码如果不加上__get()和__set()方法,程序就会出错,因为不能在类的外部操作私有成员,而上面的代码是通过自动调用__get()和__set()方法来帮助我们直接存取封装的私有成员的。
__isset() 方法:在看这个方法之前我们看一下"isset()"函数的应用,isset()是测定变量是否设定用的函数,传入一个变量作为参数,如果传入的变量存在则传回true,否则传回false。
那么如果在一个对象外面使用"isset()"这个函数去测定对象里面的成员是否被设定可不可以用它呢?分两种情况,如果对象里面成员是公有的,我们就可以使用这个函数来测定成员属性,如果是私有的成员属性,这个函数就不起作用了,原因就是因为私有的被封装了,在外部不可见。那么我们就不可以在对象的外部使用"isset()"函数来测定私有成员属性是否被设定了呢?
答案是可以的,你只要在类里面加上一个"__isset()"方法就可以了,当在类外部使用"isset()"函数来测定对象里面的私有成员是否被设定时,就会自动调用类里面的"__isset()"方法了帮我们完成这样的操作,"__isset()"方法也可以做成私有的。你可以在类里面加上下面这样的代码就可以了:
private function __isset($nm){ echo "当在类外部使用isset()函数测定私有成员$nm时,自动调用<br>"; return isset($this->$nm);}
__unset()方法:看这个方法之前呢,我们也先来看一下"unset()"这个函数,"unset()"这个函数的作用是删除指定的变量且传回true,参数为要删除的变量。那么如果在一个对象外部去删除对象内部的成员属性用"unset()"函数可不可以呢,也是分两种情况,如果一个对象里面的成员属性是公有的,就可以使用这个函数在对象外面删除对象的公有属性,如果对象的成员属性是私有的,我使用这个函数就没有权限去删除,但同样如果你在一个对象里面加上"__unset()"这个方法,就可以在对象的外部去删除对象的私有成员属性了。
在对象里面加上了"__unset()"这个方法之后,在对象外部使用"unset()"函数删除对象内部的私有成员属性时,自动调用"__unset()"函数来帮
我们删除对象内部的私有成员属性,这个方法也可以在类的内部定义成私有的。在对象里面加上下面的代码就可以了:
private function __unset($nm){ echo "当在类外部使用unset()函数来删除私有成员时自动调用的<br>"; unset($this->$nm);}
最后,我们来看一个完整的实例:
<?phpclass Person { private $name; private $sex; private $age; public function __get($property_name) { if(isset($this->$property_name)) { return ($this->$property_name); } else { return (NULL); } } public function __set($property_name, $value) { $this->$property_name = $value; } public function __isset($nm) { echo "isset()函数测定私有成员时,自动调用<br>"; return isset($this->$nm); } public function __unset($nm) { echo "当在类外部使用unset()函数来删除私有成员时自动调用的<br>"; unset($this->$nm); }}$p1 = new Person();$p1->name = "this is a person name";echo var_dump(isset($p1->name))."<br>";echo $p1->name."<br>";unset($p1->name);echo $p1->name;
isset()函数测定私有成员时,自动调用
bool(true)
this is a person name
当在类外部使用unset()函数来删除私有成员时自动调用的
isset()函数测定私有成员时,自动调用
最後に、Xiaoyan は、これら 4 つのメソッドの使用法は非常に柔軟であることを思い出してもらいたいと思います。クラス内でのみプライベート変数を取得できると考えないでください。クラス内の特定のメンバー変数の値、または他のクラスの値を自由に展開できます。 誤解しないでください。 !
小さな煙 2014-12-03 転載の際は出典を明記してください。

thesecrettokeepingaphp-poweredwebsterunningsmootlyunderheavyloadinvolvesseveralkeystrategies:1)emform opcodecoduceSciptionexecutiontime、2)aatabasequerycachingwithiThing withiThistolessendavasoload、

コードをより明確かつ維持しやすくするため、依存関係が関心(DI)に注意する必要があります。 1)DIは、クラスを切り離すことにより、よりモジュール化されます。2)テストとコードの柔軟性の利便性を向上させ、3)DIコンテナを使用して複雑な依存関係を管理しますが、パフォーマンスの影響と円形の依存関係に注意してください。

はい、最適化されたAphPossibleandessention.1)CachingingusapCutoredatedAtabaseload.2)最適化、効率的なQueries、およびConnectionPooling.3)EnhcodeCodewithBultinctions、Avoididingglobalbariables、およびUsingopcodeching

keyStrategIestsoSificlyvoostphpappliceperformanceare:1)useopcodecachinglikeToreexecutiontime、2)最適化abaseの相互作用とプロペラインデックス、3)3)構成

aphpDependencyInjectionContaineriSATOULTAINATINAGECLASSDEPTINCIES、強化測定性、テスト可能性、および維持可能性。

SELECT DEPENTENCINGINOFCENT(DI)大規模なアプリケーションの場合、ServicElocatorは小さなプロジェクトまたはプロトタイプに適しています。 1)DIは、コンストラクターインジェクションを通じてコードのテスト可能性とモジュール性を改善します。 2)ServiceLocatorは、センター登録を通じてサービスを取得します。これは便利ですが、コードカップリングの増加につながる可能性があります。

phpapplicationscanbeoptimizedforspeedandEfficiencyby:1)enabingopcacheinphp.ini、2)PreparedStatementswithpordatabasequeriesを使用して、3)LoopswithArray_filterandarray_mapfordataprocessing、4)の構成ngincasaSearverseproxy、5)

PHPemailvalidationinvolvesthreesteps:1)Formatvalidationusingregularexpressionstochecktheemailformat;2)DNSvalidationtoensurethedomainhasavalidMXrecord;3)SMTPvalidation,themostthoroughmethod,whichchecksifthemailboxexistsbyconnectingtotheSMTPserver.Impl


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

メモ帳++7.3.1
使いやすく無料のコードエディター

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!
