phpthis訪問方法
⑴ php繼承的問題,調用父類的方法this指向問題。
我來說一說:
【一】…………public(僅有)屬性和方法的繼承…………
classa{
public$var='vara<br/>';
publicfunctionm(){
echo'funa<br/>';
}
publicfunctionrun(){
echo$this->var;
$this->m();
}
}
classbextendsa{
public$var='varb<br/>';
publicfunctionm(){
echo'funb<br/>';
}
}
$li=newb();
$li->run();
echo'<hr>';
var_mp($li);
輸出:
varb
funb
————————————————————————————
object(b)[1]
public'var'=>string'varb<br/>'(length=11)
在這段代碼中所表示的,是我們常見的一種繼承方式,同為公有屬性的$var 和公有方法m()
在這里,$var和m()都被繼承並覆寫,實例化過後,內存中只有一個$var實例,通過var_mp($li);我們可以看到它。
【二】…………private(私有)屬性和方法的繼承…………
classa{
private$var='vara<br/>';
privatefunctionm(){
echo'funa<br/>';
}
publicfunctionrun(){
echo$this->var;
$this->m();
var_mp($this);
echo'<br/><br/>';
}
}
classbextendsa{
private$var='varb<br/>';
privatefunctionm(){
echo'funb<br/>';
}
publicfunctionrun(){
echo$this->var;
$this->m();
var_mp($this);
echo'<br/><br/>';
parent::run();
}
}
$li=newb();
$li->run();
echo'<hr>';
var_mp($li);
輸出:
varb
funb
object(b)[1]
private'var'=>string'varb<br/>'(length=11)
private'var'(a)=>string'vara<br/>'(length=11)
.
.
vara
funa
object(b)[1]
private'var'=>string'varb<br/>'(length=11)
private'var'(a)=>string'vara<br/>'(length=11)
.
————————————————————————————————
object(b)[1]
private'var'=>string'varb<br/>'(length=11)
private'var'(a)=>string'vara<br/>'(length=11)
這個時候,我們可以看到,在調用run方法時,首先它會調用到b類的私有屬性$var 和私有方法m(),隨後,又使用parent::run()調用父類的run()方法,我們可以看到,父類的run()方法調用後,它所調用的屬性和方法,都是a類的兩個私有屬性和方法,這種形式,和你的問題一致;
而它與$this指向無關,我們可以在這里看到,兩個$this都是指向b類。
而最有意思的是,在$li句柄中,我們卻看到了兩個屬性!一個是b類的屬性,一個是a類的屬性,這兩個屬性同時存在著,那麼,私有方法也自然是同時存在著。
【三】…………私有屬性和方法能不能被繼承…………
classa{
private$var='vara<br/>';
privatefunctionm(){
echo'funa<br/>';
}
}
classbextendsa{
publicfunctionrun(){
echo$this->var;
$this->m();
}
}
$li=newb();
$li->run();
輸出:
Notice:Undefinedproperty:b::$varinE:...onLine9
Fatalerror:Calltoprivatemethoda::m()fromcontext'b'inE:...onLine10
這可以證明,私有屬性和方法,無法被繼承,所以,你的代碼示例中所說,將a類的m()方法更改為private後,會顯示aa的屬性,也就可以理解明白了。
⑵ php中關於$this問題
方法內調用類屬性,有:
$this->name
靜態屬性:
self::$name
用$this->$name的情況是:
$name = 'name';
$this->$name 這個等價於$this->name
⑶ php面向對象全攻略 (三)特殊的引用「$this」的使用
7.特殊的引用「$this」的使用
現在我們知道了如何訪問對象中的成員,是通過「對象->成員」的方式訪問的,這是在對
象的外部去訪問對象中成員的形式,那麼如果我想在對象的內部,讓對象里的方法訪問本對
象的屬性,或是對象中的方法去調用本對象的其它方法這時我們怎麼辦?因為對象裡面的所
有的成員都要用對象來調用,包括對象的內部成員之間的調用,所以在PHP
裡面給我提供了
一個本對象的引用$this,每個對象裡面都有一個對象的引用$this
來代表這個對象,完成對象
內部成員的調用,this
的本意就是「這個」的意思,上面的實例裡面,我們實例化三個實例
對象$P1、$P2、$P3,這三個對象裡面各自存在一個$this
分別代表對象$p1、$p2、$p3。
通過上圖我們可以看到,$this
就是對象內部代表這個對象的引用,在對象內部和調用本
對象的成員和對象外部調用對象的成員所使用的方式是一樣的。
$this->屬性$this->name;
$this->age;
$this->sex;
$this->方法$this->say();
$this->run();
修改一下上面的實例,讓每個人都說出自己的名字,性別和年齡:
代碼片段
復制代碼
代碼如下:
<?php
class
Person{
//下面是人的成員屬性
var
$name;
//人的名字
var
$sex;
//人的性別
var
$age;
//人的年齡
//下面是人的成員方法
function
say(){//這個人可以說話的方法
echo
"我的名字叫:".$this->name."
性別:".$this->sex."
我的年齡是:".$this->age."<br>";
}
function
run(){
//這個人可以走路的方法
echo
"這個人在走路";
}
}
$p1=new
Person();
//創建實例對象$p1
$p2=new
Person();
//創建實例對象$p2
$p3=new
Person();
//創建實例對象$p3
//下面三行是給$p1對象屬性賦值
$p1->name="張三";
$p1->sex="男";
$p1->age=20;
//下面訪問$p1對象中的說話方法
$p1->say();
//下面三行是給$p2對象屬性賦值
$p2->name="李四";
$p2->sex="女";
$p2->age=30;
//下面訪問$p2對象中的說話方法
$p2->say();
//下面三行是給$p3對象屬性賦值
$p3->name="王五";
$p3->sex="男";
$p3->age=40;
//下面訪問$p3對象中的說話方法
$p3->say();
?>
輸出結果
我的名字叫:張三性別:男我的年齡是:20
我的名字叫:李四性別:女我的年齡是:30
我的名字叫:王五性別:男我的年齡是:40
分析一下這個方法:
代碼片段
function
say(){
//這個人可以說話的方法
echo
"我的名字叫:".$this->name."
性別:".$this->sex."
我的年齡是:".$this->age."<br>";
}
在$p1、$p2
和$p3
這三個對象中都有say()這個方法,$this
分別代表這三個對象,調用相應的屬性,列印出屬性的值,這就是在對象內部訪問對象屬性的方式,如果相在say()這個方
法里調用run()這個方法也是可以的,在say()這個方法中使用$this->run()的方式來完成調用。
⑷ php裡面$this-> = 用法和意思
在訪問類的時候可以用到$this->來訪問該類裡面的所有變數,或者函數,如果:該類里定義了一個變數名叫srvMobile的那麼你就可以用$this->srvMobile=值,來到該類的srvMobile進行賦值,如果是函數的話也可以這樣子調用,如:$this->fun();
⑸ php代碼中的this什麼作用
$this->變數名或方法名,指向類中的定義的變數或方法。你這里的var應該是一個變數,但是我們一般不用這個做變數名,因為var在php4中是關鍵字,php5之後用public代替var來申明一個公共變數。
⑹ php中this的含義
下面定義了一個Cart類
<?php
class Cart
{
var $items; // 購物車中的項目
// 把 $num 個 $artnr 放入車中
function add_item ($artnr, $num)
{
$this->items[$artnr] += $num;
}
// 把 $num 個 $artnr 從車中取出
function remove_item ($artnr, $num)
{
if ($this->items[$artnr] > $num) {
$this->items[$artnr] -= $num;
return true;
} else {
return false;
}
}
}
?>
以一段代碼說明問題,在一個類的定義內部,你無法得知使用何種名稱的對象是可以訪問的:在編寫 Cart 類時,並不知道之後對象的名稱將會命名為 $cart 或者 $another_cart。因而你不能在類中使用 $cart->items。然而為了類定義的內部訪問自身的函數和變數,可以使用偽變數 $this 來達到這個目的。$this 變數可以理解為「我自己的」或者「當前對象」。因而 '$this->>items[$artnr] += $num' 可以理解為「我自己的物品數組的 $artnr 計數器加 $num」或者「在當前對象的物品數組的 $artnr 計數器加 $num」。
⑺ 在php中self與$this的分別
1、意思上的區別
self代表類,$this代表對象(self是引用靜態類的類名,而$this是引用非靜態類的實例名)
2、用法上的區別
能用$this的地方一定使用self,能用self的地方不一定能用$this。
(7)phpthis訪問方法擴展閱讀:
Python中self用法詳解
1、以Student類為例,在Python中,定義類如下:
class Student(object):
pass
(Object)表示該類從哪個類繼承下來的,Object類是所有類都會繼承的類。
2、實例:定義好了類,就可以通過Student類創建出Student的實例,創建實例是通過類名+()實現:
student = Student()
3、由於類起到模板的作用,因此,可以在創建實例的時候,把我們認為必須綁定的屬性強制填寫進去。這里就用到Python當中的一個內置方法__init__方法,例如在Student類時,把name、score等屬性綁上去:
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
⑻ php 靜態方法為什麼不能調用this
static關鍵字聲明一個屬性或方法是和類相關的,而不是和類的某個特定的實例相關,因此,這類屬性或方法也稱為「類屬性」或「類方法」。
2. 靜態變數的調用方法:只能使用slef:: 或者 類名:: 訪問,不能使用$this訪問;反之,類的成員變數未聲明為const及static時,只能使用$this訪問,不能用::訪問。