php調用子類方法
『壹』 php子類怎麼調用父類方法
<?php
classA{
staticpublic$m=1;
staticpublicfunctionm(){
echostatic::$m,'';
}
staticpublicfunctionn(){
static::n();
}
publicfunctionl(){
echo'父類方法';
}
}
classBextendsA{
staticpublic$m=111;
staticpublicfunctionm(){
parent::m();
}
staticpublicfunctionn(){
echoparent::$m,'';
}
}
B::m();
B::n();
$b=newB();
$b->l();
『貳』 PHP類繼承的問題,子類繼承父類,實例化子類,先執行父類還是先執行子類
不是這個意思。所謂「實例化子類的對象前要先實例化父類中的內容,為父類初始化」,是指當子類正在實例化時,總是鏈式調用父類構造方法初始化父類空間。換句話說,子類的構造方法必須先調用父類的構造方法,完了才能幹別的初始化工作。如果子類沒有顯式調用語句,編譯器會隱式幫你加上。
如:
public class A{ public A() { }}public class B extends A{ public B() { }}等價於:
public class A{ public A() { super();//這里實際上是Object(); //其他初始化工作 }}public class B extends A{ public B() { super();//這里實際上是A(); //其他初始化工作 }}另外,如果有這種情況:
public class A{ X x=new X(); public A() { }}public class B extends A{ Y y=new Y(); public B() {//這是類A空間里的欄位都已經初始化完畢。 }}在成員y被賦值之前,x一定已經存在。換句話說,X x=new X();一定先於Y y=new Y();執行。
『叄』 PHP中父類里調用子類的方法
無解,除非是靜態public方法,function前加static,可以testB::demo2()這樣調用
子類重寫之後的方法父類沒法調用,換句話說,父類咋知道自己會被哪個子類繼承呢,就算你強轉虛表也不一樣,無解的問題
而且父類咋需要調用子類的方法呢,就算你以後實踐中有這樣的需求,也只能說明你設計上不合理
『肆』 php父類如何調用子類的靜態方法或變數
php父類中怎麼調用子類的的靜態屬性了,Oh,my god,如果被面試官問道這種問題,你一定會說shit,fucky question。你會說我很少這么做,況且php對於靜態的操作太隨意了,php在父類調用子類的靜態屬性是一件麻煩的事情。我們知道子類中調用父類的靜態屬性,可以用self::的形式。但是父類調用子類如果用self::就只能調用到父類的靜態屬性。那麼,怎麼辦了?php是不是無法做到了?答案當然是否定的,php中還可以使用在父類中用子類的類名來調用的方法。
不過,這當中仍然存在一個問題,就是如果我有多個類繼承了同一個父類,而且父類的某個函數要用到各個子類的靜態屬性的話,就想當trouble了。這里有個php的朋友提供了一種思路,採用在子類中重載父類的方法使父類得到靜態屬性。父類中使用了get_class函數得到類名,get_class()是父類名,get_class($this)是子類名。好了得到這個再用eval函數做下執行語句就OK啦。例子:
//父類class A {
public function __con(){
//這里主要為讓大家看清楚,所以列印出來類名,供大家學習
echo(get_class($this)).'/';
echo(get_class()).'/';
eval(\$ab = . get_class($this) . ::\$table;);echo $ab;}}//子類Bclass B extends A {
static $table = 'b table';
function __construct(){
$this-__con();}}//子類Cclass C extends A{
static $table = 'c table';
function cc(){
$this-__con();}}//調用
new B; //輸出結果 B A b table
$c = new C;
上面就是php父類調用子類靜態成員的方法,在子類重載父類的方法還是相當不錯的 ,當時聽朋友提起這個時,就異常激動。父類我們也叫做基類,或者底層類。一般都是最先設計,子類就是根據各個需要來設計,所以我們子類修改的可能性比較大,操作靈活性也比較大。
『伍』 php 父類靜態 怎麼調用 子類靜態
直接用 類名::方法名/變數名
class Test{
private static $a=123;
private static function Do(){
echo "此租扮啦啦啦啦啦";
}
}
echo Test::$a;
Test::Do();
在那都可以這樣調用. 在自型旁己森灶裡面調用就用self::$a self::Do()
『陸』 php如何通過子類繼承父類共有方法訪問父類私有屬性
在父類中加個public方法,
如private
$aaa
=
'test';
public
function
getAAA(){
return
$this->aaa;
}
在子類中調用parent::getAAA();就可以獲得父類私有屬性
當然如果你想獲取多個,可以改成動態變數名,
getAAA($v){
return
$this->{$v};
}
『柒』 php怎麼獲取分類下所有子類
這是php靜態數據過早綁定的問題(即子類衡緩的all方法是從父類中繼承過來的,__CLASS__常量過早的綁定成了父類名),解決這個問題:方叢拍法一:class all{ function all() { return __CLASS__; }} class my extends all{ function all() { return __CLASS__; }}//子類定義同名的方法(這其實就是覆蓋了父類的方法,讓__CLASS__綁定為自己的類名)echo my::all();
方法二:class all{ function all() { return get_class($this); }} class my extends all{}$my = new my();//非靜態調用是不存在過早綁定的情況的。echo $my->all();
這個可以看看php5.3.0版本之後的靜態遲綁定滲攔羨相關信息(static關鍵字)
『捌』 PHP子類怎麼調用父類的屬性
父類的Pname
是
private
類型,也就是私有的只能父類自己的
函數調用
,子類以及外部是無法調用的。
如果這個變數只允許本類方法調用
應該用
private
方式調用,如果允許本類以及子類調用應該用
protected
保護)修飾,如果希望外部調用則應該用
public
公開修飾。這三個關鍵詞對函數同樣有效。
我把php.net關於這個的說明放在下面參考資料裡面了,你可以仔細看下。
『玖』 PHP子類怎麼調用父類的屬性
<?php
class Perpon {
private $Pid;
private $Pname;
private $Page;
private $Psex;
private $Pbirthday;
public function __construct($Pid,$Pname,$Page,$Psex,$Pbirthday)//PHP5中間的構造函數
{ $this->Pid=$Pid;
$this->Pname=$Pname;
$this->Page=$Page;
$this->Pbirthday=$Pbirthday;
echo "創建了一個對象"."<br>";
}
public function __set($name,$value) {
$this->$name=$value;
}
function show(){
echo ("我的姓名:$this->Pname,我的年齡:$this->Page,我的性別是:$this->Psex,我的生日是$this->Pbirthday <br>"); }
public function __get($name) { return $name; }
public function dining() { echo "$this->Pname 正在吃飯 <br>"; }
public function shuohua() { echo "$this->Pname喜歡說話 <br>"; }
public function gaosu() { echo "我的姓名叫做$this->Pname <br>"; }
public function IT() { echo $this->Pname."的工作是IT行業 <br>"; }
}
class Student extends Perpon {
public function __construct()//PHP5中間的構造函數
{ echo "子類的構造函數"; }
public function IT()//PHP5中間的構造函數
{ parent::IT();
echo $this->Pname."的工作是學生<br>";
}
}
$perpon=new Perpon('1','zhangsan','18','男','9月23'); $perpon->show(); $perpon->dining(); $perpon->shuohua(); $perpon->gaosu(); $perpon->IT();
echo "<hr>";
$student=new Student(); $student->IT();?>
調不到的原因是:
private $Pname;
記住:private只能自己調用,其他是不行的,這一點你自己記住即可。
『拾』 php 父類為什麼能調用子類的屬性
在集成的時候父類的屬性會被保護。如果想要調用父類的屬性必須使用父類對象super去調用,不然訪問不了。你在子類中沒有X的屬性,所以在調用時使用this或super調用屬性,這個時候不論是this還是super調用的都是父類的X屬性。