php訪問屬性
訪問器屬性不包含數據值;它們包含一對getter和setter函數(不過,這兩個函數都不是必須的)。在讀取訪問器屬性時,會調用getter函數,這個函數負責返回有效的值;在寫入訪問器屬性時,會調用setter函數並傳入新值,這個函數負責決定如何處理數據。訪問器屬性有如下4個特性。
[[Configurable]]:表示能否通過delete刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為數據屬性。對於直接在對象上定義的屬性,這個特性的默認值為true。
[[Enumerable]]:表示能否通過for-in循環返回屬性。對於直接在對象上定義的屬性,這個特性的默認值為true。
[[Get]]:在讀取屬性時調用的函數。默認值為undefined。
[[Set]]:在寫入屬性時調用的函數。默認值為undefined。
訪問器屬性不能直接定義,必須使用Object.defineProperty()來定義。例如:
var
book
=
{
_year:2004,
edition:1
};
Object.defineProperty(book,"year",{
get:function(){
return
this._year;
},
set:function(newValue){
if(newValue>2004)
{
this._year
=
newValue;
this.edition
+=
newValue-2004;
}
}
});
book.year
=
2005;
alert(book.edition);//2
以上代碼創建了一個book對象,並給它定義兩個默認的屬性:_year和edition。_year前面的下劃線是一種常用的記號,用於表示只能通過對象方法訪問的屬性。而訪問器屬性year則包含一個getter函數和一個setter函數。getter函數返回_year的值,setter函數通過計算來確定正確的版本。因此,把year屬性修改為2005會導致_year變成2005,而edition變為2。這是使用訪問器屬性的常見方式,即設置一個屬性的值會導致其他屬性發生變化。
不一定非要同時制定getter和setter。只指定getter意味著屬性不能寫,嘗試寫入屬性會被忽略。在嚴格模式下,嘗試寫入只指定了getter函數的屬性會拋出錯誤。類似的,只指定setter函數的屬性也不能讀,否則在非嚴格模式下會返回undefined,而在嚴格模式下會拋出錯誤。
支持ECMAScript
5的這個方法的瀏覽器有IE9+(IE8隻是部分實現)、FF4+、Safari5+、Opera12+和Chrome。在這個方法之前,要創建訪問器屬性,一般都使用兩個標準的方法:_defineGetter_()和_defineSetter_()。這兩個方法最初是由Firefox引入的,後來Safari3、Chrome1和Opera9.5也給出了相同的實現。使用這兩個遺留的方法,可以像下面這樣重寫前面的例子。
var
book
={
_year=2004,
edition:1
};
//定義訪問器的舊方法
book._defineGetter_("year",function(){
return
this._year;
});
book._defineSetter_("year",function(){
if(newValue>2004){
this._year
=
newValue;
this.edition
+=
newValue
-
2004;
}
});
book.year=2005;
alert(book.edition);//2
在不支持Object.defineProperty()方法的瀏覽器中不能修改[[Configurable]]和[[Enumerable]]。
2. php你如何訪問和設置一個類的屬性
class Demo
{
private $_var1 = 0;
public function getVar1()
{
return $this->_var1;
}
public function setVar1($value)
{
$this->_var1 = $value;
}
}
$demo = new Demo();
$demo->setVar1(10);
echo $demo->getVar1();
3. 關於 php 類成員屬性聲明和訪問的問題
你總共提了三個問題,三個問題都是關於訪問許可權控制的,建議你將面向對象的訪問許可權控制的那部分給學習一下。
(1)類里的變數是否一定要聲明為成員屬性,
答:不一定,在一個類中,有構造函數、屬性、方法;未在方法和構造函數中聲明的變數為屬性,屬性是體現這一個類(對象)的特性的描述,他是這個類的特性的描述,這個類的狀態的改變將會隨著這些屬性值的改變而改變。如果某一變數不屬於這個類的屬性,當然可以聲明在別的地方,只要在訪問許可權內,當然也可以訪問,就像foreach($this->post as $key=>$value),$key與$value都不是類的屬性,當然不用聲明在類的屬性部分了,這里的$key與$value便成了這個方法的局部變數。
(2)非類的屬性,絕對不能用$this->來訪問,$this指的是當前對象,$this->所指向的是當前對象的屬性或許方法,既然不是類的屬性,當然不能用$this->來訪問了,
4. 在php中如何設置類的屬性,如何調用類的方法
PHP訪問類的屬性、方法使用箭頭語法(->)。這里我給你一個例子供你參考:
<?php
classMyClass{//定義MyClass類
public$name;//定義了一個公有屬性
protected$_age;//定義了一個保護屬性
private$_email;//定義了一個私有屬性
publicfunctionmy_method(){//定義my_method方法
}
protectedfunction_my_method2(){//定義_my_method2方法
}
}
$obj=newMyClass;//實例化
$obj->name='noname';//設置name屬性
$obj->_age=12;//這是錯誤的,不能設置保護屬性
$obj->address='KingStreet.'//設置一個未聲明的屬性是允許的,效果和公有屬性類似,但未賦值前不能使用。
$obj->my_method()//調用公有方法
$obj->_my_method2();//這是錯誤的,不能調用保護方法
你需要理解繼承、公有、保護和私有的概念。
繼承:子類繼承父類的公有、保護屬性和方法。
公有:類的實例可以訪問的屬性和方法。
保護:只能在類的內部及其子類內部訪問的屬性和方法。
私有:只能在類的內部訪問的屬性和方法。
這是個很基礎的問題,建議你多看書。
5. php 實例化對象為什麼可以訪問靜態屬性
實例化的對象不能訪問靜態屬性,但是沒有說不能用實例化的對象方法訪問靜態屬性。
意思是不能通過($對象名->靜態變數)這種方式訪問
可以通過$foo::$my_static; 來訪問
6. php子類可以繼承和訪問父類的私有屬性和方法嗎
你這樣理解也可以,當父類有私有的方法和屬性,子類是繼承不到的,所以子類不能訪問父類的私有方法和屬性。java
特性,private:類中只要限定為private的成員,只能被這個類本身訪問
7. php訪問對象屬性為數組時的情況
一樣得,例如:
<?php
classstudent{
private$id;//定義屬性,學號
private$name;//定義屬性,姓名
private$teacher;//定義屬性,所屬老師,array
//讀取值
publicfunctiongetteacher(){
$this->teacher=array('甲','乙');
return$this->teacher;
}
}
$d=newstudent();
$stu_teacher=$d->getteacher();
echo"<pre>";
print_r($stu_teacher);
echo"</pre>";
?>
8. PHP中,為什麼子類可以訪問父類的私有屬性,而且可以直接調用
你寫的不對哦。
按你寫的,
name
是子類是屬性,而不是父類的。
這樣:
<?php
class
Person
{
private
$name="zhangsan";
}
class
Man
extends
Person
{
}
$m
=
new
Man();
//$m->name="zhangsan";
echo
$m->name;
?>
9. php如何通過子類繼承父類共有方法訪問父類私有屬性
在父類中加個public方法,
如private
$aaa
=
'test';
public
function
getAAA(){
return
$this->aaa;
}
在子類中調用parent::getAAA();就可以獲得父類私有屬性
當然如果你想獲取多個,可以改成動態變數名,
getAAA($v){
return
$this->{$v};
}
10. php 對象直接訪問私有屬性~呢
觀察了你的很多問題,為什麼都要以'呢'結尾呢?
私有屬性只有在雷內才可以訪問,對象如果要訪問的話,需要一個public入口才能訪問.也就是
public function getPrivate(){
return $this->private;
}