ホームページ > バックエンド開発 > PHPチュートリアル > 改良されたオブジェクト指向 PHP_PHP チュートリアルの説明

改良されたオブジェクト指向 PHP_PHP チュートリアルの説明

WBOY
リリース: 2016-07-13 17:35:29
オリジナル
759 人が閲覧しました

先看代码:
class StrictCoordinateClass {
private $arr = array(x => NULL, y => NULL);
function __construct() {
print "StrictCoordinateClass is being created";
print "
";
}
function __destruct() {
print "
";
print "StrictCoordinateClass is being destroyed";
}
function __get($property) {
if (array_key_exists($property, $this->arr)) {
return $this->arr[$property];
} else {
print "Error: Cant read a property other than x & y ";
}
}
function __set($property, $value) {
if (array_key_exists($property, $this->arr)) {
$this->arr[$property] = $value;
} else {
print "Error: Cant write a property other than x & y ";
}
}
}
$obj = new StrictCoordinateClass();
$obj->x = 1;
print $obj->x;
print "
";
$obj->n = 2;
print "
";
print $obj->n;
?>

输出结果:
StrictCoordinateClass is being created
1
Error: Cant write a property other than x & y
Error: Cant read a property other than x & y
StrictCoordinateClass is being destroyed
__construct()和__destruct()相当于Java中的构造函数以及C中的析构函数。
至于__get和__set请看下文:
参考自:http://www.phpchina.com/html/54/26354-31906.html
.__set() __get() __isset() __unset()四个方法的应用
一般来说,总是把类的属性定义为private,这更符合现实的逻辑。但是,对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数“__get()”和“__set()”来获取和赋值其属性,以及检查属性的“__isset()”和删除属性的方法“__unset()”。
上一节中,我们为每个属性做了设置和获取的方法,在PHP5中给我们提供了专门为属性设置值和获取值的方法,“__set()”和“__get()”这两个方法,这两个方法不是默认存在的,而是我们手工添加到类里面去的,像构造方法(__construct())一样,类里面添加了才会存在,可以按下面的方式来添加这两个方法,当然也可以按个人的风格来添加:
//__get()方法用来获取私有属性
private function__get($property_name) {
if(isset($this->$property_name)) {
return($this->$property_name);
}else {
return(NULL);
}
}
//__set()方法用来设置私有属性
private function__set($property_name,$value) {
$this->$property_name=$value;
}
__get() 方法:这个方法用来获取私有成员属性值的,有一个参数,参数传入你要获取的成员属性的名称,返回获取的属性值,这个方法不用我们手工的去调用,因为我们也可以把这个方法做成私有的方法,是在直接获取私有属性的时候对象自动调用的。因为私有属性已经被封装上了,是不能直接获取值的(比如:“echo $p1->name”这样直接获取是错误的),但是如果你在类里面加上了这个方法,在使用“echo $p1->name”这样的语句直接获取值的时候就会自动调用__get($property_name)方法,将属性name传给参数$property_name,通过这个方法的内部执行,返回我们传入的私有属性的值。如果成员属性不封装成私有的,对象本身就不会去自动调用这个方法。
__set() 方法:这个方法用来为私有成员属性设置值的,有两个参数,第一个参数为你要为设置值的属性名,第二个参数是要给属性设置的值,没有返回值。这个方法同样不用我们手工去调用,它也可以做成私有的,是在直接设置私有属性值的时候自动调用的,同样属性私有的已经被封装上
了,如果没有__set()这个方法,是不允许的,比如:$this->name=‘zhangsan,这样会出错,但是如果你在类里面加上了 __set($property_name, $value)这个方法,在直接给私有属性赋值的时候,就会自动调用它,把属性比如name传给$property_name,把要赋的值 “zhangsan”传给$value,通过这个方法的执行,达到赋值的目的。如果成员属性不封装成私有的,对象本身就不会去自动调用这个方法。为了不传入非法的值,还可以在这个方法给做一下判断。代码如下:
classPerson {
//下面是人的成员属性, 都是封装的私有成员
private $name; //人的名子
private $sex; //人的性别
private $age; //人的年龄
//__get()方法用来获取私有属性
private function__get($property_name) {
echo"在直接获取私有属性值的时候,自动调用了这个__get()方法
";
if(isset($this->$property_name)) {
return($this->$property_name);
} else {
return(NULL);
}
}
//__set()方法用来设置私有属性
private function__set($property_name,$value) {
echo"在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值
";
$this->$property_name=$value;
}
}
$p1=newPerson();
//直接为私有属性赋值的操作, 会自动调用__set()方法进行赋值
$p1->name="张三";
$p1->sex="男";
$p1->age=20;
//直接获取私有属性的值, 会自动调用__get()方法,返回成员属性的值
echo"姓名:".$p1->name."
";
echo"性别:".$p1->sex."
";
echo"年龄:".$p1->age."
";
?>

プログラムの実行結果:
プライベート属性の値を直接設定する場合、__set()メソッドが自動的に呼び出され、プライベート属性に値が割り当てられます。
プライベート属性の値を直接設定する場合、__set()メソッドは割り当て
プライベート属性の値を直接設定する場合、__set()メソッドが自動的に呼び出され、プライベート属性に値を割り当てます
プライベート属性の値を直接取得する場合、 __get()メソッドが自動的に呼び出されます
名前:Zhang San
Inプライベート属性値を直接取得する場合、この__get()メソッドが自動的に呼び出されます
性別:男性
プライベート属性値を直接取得する場合、この__get()メソッドは自動的に呼び出されます
年齢: 20歳
上記のコードを追加しない場合 __get() メソッドと __set() メソッドを使用すると、クラス外でプライベート メンバーを操作できないため、プログラムが正常に動作しません。上記のコードが直接役に立ちます。 __get() メソッドと __set() メソッドを自動的に呼び出して、カプセル化されたプライベート メンバーを取得して保存します。
__isset() メソッド: このメソッドを説明する前に、「isset()」関数の応用を見てみましょう。 isset() は、変数がパラメータとして設定されているかどうかを判断するために使用される関数です。渡された変数が存在する場合は true を返し、それ以外の場合は false を返します。では、オブジェクトの外部で「isset()」関数を使用して、オブジェクト内のメンバーが設定されているかどうかを判断する場合、それを使用できるでしょうか?オブジェクト内のメンバーがパブリックである場合、この関数を使用してメンバー属性を測定できますが、プライベートなメンバー属性はカプセル化されているため、この関数は機能しません。外部に露出します。では、オブジェクトの外部で「isset()」関数を使用して、プライベートメンバー属性が設定されているかどうかを判断することはできないのでしょうか?はい、「__isset()」メソッドをクラスに追加するだけで済みます。オブジェクト内のプライベートメンバーが設定されているかどうかを判断するために「isset()」関数がクラスの外部で使用される場合、この関数は内部で自動的に呼び出されます。 「__isset()」メソッドはそのような操作を完了するのに役立ち、「__isset()」メソッドをプライベートにすることもできます。次のコードをクラスに追加するだけです:
private function__isset($nm) {
echo"クラス外で isset() 関数を使用してプライベート メンバー $nm を決定する場合、自動的に
return isset を呼び出します。"; ($this->$nm);
}
__unset() メソッド: このメソッドを見る前に、まず「unset()」関数と「unset()」関数の役割を見てみましょう。指定された変数を返し、true を返します。パラメータは削除される変数です。では、オブジェクトの外部にあるオブジェクト内のメンバー属性を削除したい場合は、「unset()」関数を使用できますか? オブジェクト内のメンバー属性がパブリックである場合、この関数を使用して削除できます。オブジェクトのパブリック属性。オブジェクトのメンバー属性がプライベートである場合、同様に、オブジェクトに「__unset()」メソッドを追加する場合も同様です。 、オブジェクトのプライベート メンバー プロパティから削除できます。 「__unset()」メソッドをオブジェクトに追加した後、オブジェクトの外部で「unset()」関数を使用してオブジェクト内のプライベートメンバー属性を削除すると、「__unset()」関数が自動的に呼び出され、オブジェクト内のプライベート メンバー属性。このメソッドはクラス内でプライベートとして定義することもできます。次のコードをオブジェクトに追加するだけです:
private function__unset($nm) {
echo"プライベート メンバーを削除するためにクラス外で unset() 関数が使用されると自動的に呼び出されます
";
unset($ this-> $nm);
}
完全な例を見てみましょう:
classperson {
//以下は人物のメンバー属性です
private $name //人物の名前
private $ sex; ; //人の性別
private $age; //人の年齢
//__get()メソッドはプライベートプロパティを取得するために使用されます
private function__get($property_name) {
if(isset($this->$property_name) ) {
return($this->$property_name);
}else{
return(NULL);
}
}
//__set() メソッドはプライベート プロパティの設定に使用されます
private function__set($property_name,$value) {
$this->$property_name=$value;
}
//__isset() メソッド
private function__isset($nm) {
echo "isset() 関数がプライベート メンバーを決定すると、自動的に呼び出されます
" ;
return isset($this->$nm);
}
//__unset()メソッド
private function__unset($nm) {
echo"は、削除するためにクラス外でunset()関数が使用されると自動的に呼び出されます。プライベート メンバー
";
unset($this->$nm);
}
}
$p1=newperson();
$p1->name="これは人の名前です";
/ /in isset() 関数を使用してプライベート メンバーを測定する場合、完了を支援するために __isset() メソッドが自動的に呼び出され、返される結果は true
echovar_dump(isset($p1->name)) です。"< ;br>";
echo $p1 ->name."
";

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/508329.html技術記事先看代: ?php class StrictCoownedClass { private $arr = array(x = NULL, y = NULL); function __construct() { print "StrictCoownedClass を作成しています"; 「br/」を印刷します。 }...

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