首頁 後端開發 php教程 php _set _get _isset _unset用法防被忽悠分析

php _set _get _isset _unset用法防被忽悠分析

Jun 13, 2016 pm 12:10 PM
isset name property quot unset

php __set __get __isset __unset用法防被忽悠分析

大家好我是小烟  今天分享下 php面向对象中__set __get __isset __unset用法之防忽悠介绍

全文注意=====================================

__set __get __isset __unset  这些方法 老版本php是可以设置成私有的 但是现在php版本 最好不要设置成私有 更不能设置成静态 设置成静态方法直接就出错了  设置成私有的话 虽然能正常返回值 但是会有个 Warning 警告!!(本人是php5.5版本)



正文开始======================================


我们经常会在php的面向对象中可以看到位__set __get __isset __unset这些东西的用法,但很不明白为什么会要用这些东西,下面我们来一一介绍一下他们哥四的用法吧。

  一般来说,总是把类的属性定义为private,这更符合现实的逻辑。但是,对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数“__get()”和“__set()”来获取和赋值其属性,以及检查属性的“__isset()”和删除属性的方法“__unset()”。


我们为每个属性做了设置和获取的方法,在PHP5中给我们提供了专门为属性设置值和获取值的方法,“__set()”和“__get()”这两个方法,这两个方法不是默认存在的,而是我们手工添加到类里面去的,像构造方法(__construct())一样, 类里面添加了才会存在,可以按下面的方式来添加这两个方法,当然也可以按个人的风格来添加:

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()方法:这个方法用来获取私有成员属性值的,有一个参数,参数传入你要获取的成员属性的名称,返回获取的属性值,这个方法不用我们手工的去调用,因为我们也可以把这个方法做成私有的方法,是在直接获取私有属性的时候对象自动调用的。因为私有属性已经被封装上了,是不能直接获取值的(比如:"echo $p1->name"这样直接获取是错误的),但是如果你在类里面加上了这个方法,在使用"echo $p1->name"这样的语句直接获取值的时候就会自动调用__get($property_name)方法,将属性name传给参数$property_name,通过这个方法的内部执行,返回我们传入的私有属性的值。如果成员属性不封装成私有的,对象本身就不会去自动调用这个方法。

 基本上网上 99%的文章 介绍 __get() 都是这么说的 但是我还要说最关键的是  __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()函数测定私有成员时,自动调用


最后最后 小烟还是要提醒下你 这四个方法用法都是非常的灵活的 不要以为只能获取类里面的私有变量 而且可以自由扩展 获取类里某个特定成员变量的值 或者 其他类里面的值切记切记  不要被误导!!

小烟 2014-12-03     转载请注明出处 谢谢!


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1667
14
CakePHP 教程
1426
52
Laravel 教程
1328
25
PHP教程
1273
29
C# 教程
1255
24
PHP Notice: Undefined property: 的解決方法 PHP Notice: Undefined property: 的解決方法 Jun 22, 2023 pm 02:48 PM

在使用PHP編寫程式碼時,我們可能會遇到「Notice:Undefinedproperty」這個錯誤提示。這個錯誤提示意味著我們正在存取一個未定義的屬性,通常是因為該屬性在程式碼中尚未被初始化。那麼,該如何解決這個問題呢?以下是幾種可能的解決方法:初始化屬性這是解決問題的最簡單方法。在程式碼中明確地初始化屬性,可以確保它在使用前已經被定義。例如:class

PHP Notice: Trying to get property of non-object - 解決方法 PHP Notice: Trying to get property of non-object - 解決方法 Aug 17, 2023 am 09:27 AM

PHPNotice:Tryingtogetpropertyofnon-object-解決方法在PHP開發過程中,我們可能會遇到一個常見的錯誤提示:Tryingtogetpropertyofnon-object(試圖取得非物件的屬性)。這個錯誤通常是由我們對一個非物件類型的變數嘗試存取屬性(或呼叫方法)時引起的。這篇文章將向你介紹這

PHP判斷某個數組中是否存在指定的key PHP判斷某個數組中是否存在指定的key Mar 21, 2024 pm 09:21 PM

這篇文章將為大家詳細講解有關PHP判斷某個數組中是否存在指定的key,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章後可以有所收穫。 PHP判斷某個陣列中是否存在指定的key:在php中,判斷某個陣列中是否存在指定的key的方法有多種:1.使用isset()函數:isset($array[&quot;key&quot;])此函數傳回布林值,如果指定的key存在,則傳回true,否則傳回false。 2.使用array_key_exists()函數:array_key_exists(&quot;key&quot;,$arr

Vue中的TypeError: Cannot read property 'XXX' of null,該怎麼辦? Vue中的TypeError: Cannot read property 'XXX' of null,該怎麼辦? Nov 25, 2023 pm 01:21 PM

Vue是一種流行的用於建立使用者介面的JavaScript框架。在開發過程中,我們可能會遇到各種錯誤和異常。其中一個常見的錯誤是"TypeError:Cannotreadproperty'XXX'ofnull"。在本文中,我們將探討這個錯誤的原因以及如何解決它。首先,讓我們來了解這個錯誤背後的原因。當我們嘗試存取一個物件的屬性或方法時,如果該對

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 Jun 13, 2016 am 10:23 AM

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code

Vue中的TypeError: Cannot read property 'XXX' of undefined,該怎麼辦? Vue中的TypeError: Cannot read property 'XXX' of undefined,該怎麼辦? Nov 25, 2023 am 10:56 AM

Vue中的TypeError:Cannotreadproperty'XXX'ofundefined,該怎麼辦?對於使用Vue開發的前端開發者來說,可能在開發過程中經常遇到TypeError:Cannotreadproperty'XXX'ofundefined的錯誤。這個錯誤通常出現在嘗試存取一個未定義(undefined)的屬性時。在

Vue中的TypeError: Cannot read property '$XXX' of undefined,解決方法有哪些? Vue中的TypeError: Cannot read property '$XXX' of undefined,解決方法有哪些? Nov 25, 2023 am 10:00 AM

Vue中的TypeError:Cannotreadproperty'$XXX'ofundefined,解決方法有哪些?在Vue開發中,常常會遇到TypeError:Cannotreadproperty'$XXX'ofundefined這樣的錯誤。這種錯誤通常是因為在Vue實例中使用了未定義的屬性或方法而引起的。出現這個錯誤時,我們需要

PHP Notice: Trying to get property of non-object解決方法 PHP Notice: Trying to get property of non-object解決方法 Jun 24, 2023 pm 09:34 PM

PHPNotice:Tryingtogetpropertyofnon-object解決方法當你在使用PHP進行開發時,你可能會遇到這樣的錯誤提示:「Notice:Tryingtogetpropertyofnon-object。」這個錯誤提示通常是由於你使用了一個未初始化的對象,或是你的物件在某一段程式碼中遺失了引用,因此無法正確存取屬

See all articles