php私有屬性
⑴ php彈出「undefined property:stdclass」 ,怎麼解決
這種情況一般是你對一個類對象,使用了屬性調用造成的。
比如應該是
echo$a->att1;
你寫錯成了:
echo$a['att1'];
改回來就可以了。
PHP中使用關鍵字 class 來定義一個類。類的命名一般使用首字元大寫,而後每個單詞首字元大寫連接的方式方便閱讀。
在PHP5中,屬性指在class 中聲明的變數。在聲明變數時,必須使用 public private protected 之一進行修飾,定義變數的訪問許可權。PHP中的屬性:用來描述對象的數據元素稱為對象的屬性(也稱為數據/狀態)
Public(公開): 可以自由的在類的內部外部讀取、修改。
Private(私有): 只能在這個當前類的內部讀取、修改。
Protected(受保護):能夠在這個類和類的子類中讀取和修改。屬性的使用:通過引用變數的 -> 符號調用變數指向對象的屬性。
在方法內部通過 $this-> 符號調用同一對象的屬性。
所以應該用箭頭調用而不是括弧。
⑵ 在PHP里,子類是不是可以繼承父類的私有屬性,但不能訪問啊
用print_r來檢測一下這個對象
注釋掉的時候
print_r($s1);
Student Object
(
[name:Person:private] => ys
)
告訴我們name是Person類私有的屬性
當沒注釋掉的時候
print_r($s1);
Student Object
(
[name:Person:private] => ys
[name] => 子類
)
告訴我們name是Person類私有的屬性,有給Student類添加了一個name屬性
我們還注釋掉,再修改如下
$s1 = new Student();
$s1->name = '子類'; //添加一個屬性為name
$s1->say();
跟上面一樣的結果
從這些調試結果分析,繼承跟訪問可以這樣說是一個概念,私有不可以繼承過來。
你繼承的時候加的那個$this->name是又新添加了一個name屬性,跟父類的name屬性無關
⑶ php中Get方法跟Post方法的區別
php中Get方法跟Post方法的區別
php——get方法 :
這個方法用來獲取私有成員屬性值的,有一個參數,參數傳入你要獲取的成員屬性的名稱,返回獲取的屬性值,這個方法不用手工的去調用,因為也可以把這個方法做成私有的方法,是在直接獲取私有屬性的時候對象自動調用的。
因為私有屬性已經被封裝上了,是不能直接獲取值的,但是如果你在類裡面加上了這個方法,在使用「echo$p1->name」這樣的語句直接獲取值的時候就會自動調用__get($name)方法,將屬性name傳給參數$name,通過這個方法的內部執行,返回傳入的.私有屬性的值。
如果成員屬性不封裝成私有的,對象本身就不會去自動調用這個方法。
php——post方法 :
這個方法用於傳送數據,用法與get方法類似,但有區別。
區別 :
Get方法在超鏈接後邊緊跟要傳遞的參數對於用戶是可見的如:%D6%A3%D6%DD%B4%F3%D1%A7&fr=index&ie=utf-8
而Post方法傳遞的參數是不可見的。
GET是從伺服器上獲取數據;POST是向伺服器傳送數據。
在客戶端,GET通過URL提交數據,數據在URL中可見;POST把數據放在form的數據體內提交。
GET提交的數據最多隻有1024位元組;POST提交的數據量無限制。
由於使用GET時,參數會顯示在地址欄上,而POST不會,所以,如果這些數據是非敏感數據,那麼使用GET;如果包含敏感數據,為了安全,用POST方法。
;⑷ php,子類無法訪問父類私有屬性,子類實例化再賦值後,子類所添加的新成員屬性不存在
我把涉及到這個問題的知識點,可以和大家分享一下:
1.父類humanBeing , 子類student , 實例對象 $m (注意:$m是子類student 的實例,和humanBeijing沒有直接關系)
2.private 的屬性.僅在本類里使用;任何子類、實例對象都無法訪問,更別說賦值。這個在書本上都一直是這么說滴。。哈哈。。。
根據以上知識點,來看你這個問題:
$student1=new student;
/*實例一個student的對象,此時注意,這個對象並不會繼承父類humanBeing的三個 private變數$name,$age,$gender*/
$student1->name='zhangsan';
$student1->age=20;
$student1->gender='male';
/*這里需要注意.很多人會誤以為是給父類humanBeing的三個屬性賦值了,這是錯的。這里的賦值,僅僅是給子類student的三個屬性賦值,這里也許會有人問,子類student那有什麼屬性呀?在php中,所有的變數,不要求申明,在類中屬性也是一樣的,不要求申明,而且類中,默認都是public。所以上面的這三行代碼,僅僅是子類student的三個屬性賦值,和父類humanBeing的三個屬性,沒有任何關系,僅僅名字一樣而已*/
function say(){
echo "My name is {$this->name} and I am {$this->age} years old. I am {$this->gender}.<br />";
}
/*這個是父類humanBeing的公有方法,(默認的是public的),這個方法中 $this -> name.這里的$this 是指父類student,$this -> name是指父類student的屬性,從始至終,它並沒有被賦值,所以它是空的,(而且它也不能被賦值,因為是private),這里的$student1->name='zhangsan';賦值操作,僅僅是修改子類student的$name */
我想這么回答,你應該非常清楚了吧
再來理解後面的例子,就很容易了。
$m->name="zhangsan";
/*僅僅是給子類Man的屬性賦值,而且因為可以省略聲明,默認又是public的,所以能直接賦值,當然也可以輸出了*/
class Person{
private $name;
}
/*可以直接把private $name;去掉,因為後面的賦值,跟它沒有任何關系,直接修改成*/
class Person{
}
⑸ PHP中常用的11個魔術方法
在PHP中,常用的11個魔術方法及其功能概述如下:
__get 和 __set
- __get:用於獲取未聲明的屬性。
- __set:用於設置未聲明的屬性。
- 這兩個方法特別適用於處理私有或受保護屬性的訪問。
__isset 和 __unset
- __isset:用於檢查未定義的屬性是否存在。
- __unset:用於刪除未定義的屬性。
- 這兩個方法也處理私有或受保護屬性的訪問控制。
__call
- 當嘗試調用未聲明的方法時,此方法會被調用。
- 對於實現方法重載或執行自定義行為非常有用。
__autoload
- 自動載入類的功能。
- 當嘗試使用尚未定義的類時,此方法會被調用,允許在類未被直接載入前載入它們。
__construct 和 __destruct
- __construct:構造方法,在實例創建時執行,用於初始化對象。
- __destruct:析構方法,在對象銷毀時執行,用於釋放資源。
__clone
- 在對象復制時,此方法被自動調用。
- 使用clone語句復制對象時,用於執行任何額外的初始化操作。
__toString
- 當嘗試將對象轉換為字元串時,此方法會被調用。
- 確保對象可以被正確顯示。
__sleep 和 __wakeup
- __sleep:在對象序列化前執行,用於清理不需要存儲的對象狀態。
- __wakeup:在反序列化後執行,用於重建任何被序列化時丟失的資源。
__set_state
- 當調用var_export函數時,此方法被調用。
- 用於反序列化對象狀態。
__invoke
- 當嘗試以函數調用方式調用對象時,此方法被自動調用。
- 實現對象作為函數的使用。
__callStatic
- 與__call方法類似,但用於處理靜態方法的調用。
- 確保靜態方法的正確執行。
這些魔術方法極大地增強了PHP類的靈活性和功能,允許開發者以更簡潔的方式實現復雜的功能。在使用時,應確保所有魔術方法都被定義為公共的,以確保它們的正確執行。
⑹ php類屬性的賦值問題
cache_factory::$cache_factory 是 類 cache_factory 的一個單例 , 該語句的意思是給 這個單例實例的cache_config屬性賦初值,我這么說能聽懂嗎?!
享笑網為您解答。可以來我們這里看看,有不清楚的,我再給你解釋。
⑺ 在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();//這是錯誤的,不能調用保護方法
你需要理解繼承、公有、保護和私有的概念。
繼承:子類繼承父類的公有、保護屬性和方法。
公有:類的實例可以訪問的屬性和方法。
保護:只能在類的內部及其子類內部訪問的屬性和方法。
私有:只能在類的內部訪問的屬性和方法。
這是個很基礎的問題,建議你多看書。
⑻ php菜鳥提問~面向對象里的對私有欄位成員的賦值取值操作時採用攔截器……
現在,老師只是給你看了個簡單的例子
實際用途中,是很有用的,比如你需要傳入大量的變數 或者 你需要賦值的變數需要進行安全判斷或者類型判斷等。 下面是一個簡單的例子,希望可以幫到你
classcla{
private$a=array();
publicfunction__set($key,$value){
$this->a[$key]=$value;
}
publicfunction__get($key){
return$this->a[$key];
}
}
$cla=newcla();
$cla->b1='b1';
$cla->b2='b2';
echo$cla->b1;
echo'<br>';
echo$cla->b2;
這個代碼 在很多介面調用中,經常用到