繼承php
Ⅰ php一個類文件如何繼承另一個類文件
include_once("a.php");
classbextendsa{
}
Ⅱ php中的類是單繼承,那要有多個類繼承怎麼辦
PHP沒有多繼承的特性。即使是一門支持多繼承的編程語言,我們也很少會使用這個特性。在大多數人看來,多繼承不是一種好的設計方法。想要給某個類添加額外的特性,不一定要使用繼承。這里我提供一種模擬多繼承的方法以供參考。
PHP有一個魔術方法,叫做__call。當你調用一個不存在的方法時,這個方法會被自動調用。這時,我們就有機會將調用重定向到一個存在的方法。繼承多個父類的子類,尋找方法的過程一般是這樣的:
本身的方法 -> 父類1的方法 -> 父類2的方法...
模擬過程大致是這樣:將各個父類實例化,然後作為子類的屬性。這些父類提供一些公有的方法。當子類擁有某方法時,__call()函數不會被調用。這相當於「覆蓋」了父類的方法。當調用了不存在的方法時,通過__call()方法依次從父類中尋找可以調用的方法。雖然這不是完備的多繼承,但可以幫助我們解決問題。
<?php
classParent1{
functionmethod1(){}
functionmethod2(){}
}
classParent2{
functionmethod3(){}
functionmethod4(){}
}
classChild{
protected$_parents=array();
publicfunctionChild(array$parents=array()){
$_parents=$parents;
}
publicfunction__call($method,$args){
//從「父類"中查找方法
foreach($this->_parentsas$p){
if(is_callable(array($p,$method))){
returncall_user_func_array(array($p,$method),$args);
}
}
//恢復默認的行為,會引發一個方法不存在的致命錯誤
returncall_user_func_array(array($this,$method),$args);
}
}
$obj=newChild(array(newParent1(),newParent2()));
$obj->method1();
$obj->method3();
這里沒有涉及屬性的繼承,但實現起來並不困難。可以通過__set()和__get()魔術方法來模擬屬性的繼承。請你動手實踐。
Ⅲ 細說php 抽象類能不能被繼承 php
當然可以。
它的作用就是規定好方法,讓別人繼承來實現方法,這是一種代碼管理手段。
抽象類的方法,沒有方法體,繼承該抽象類的類必須實現所有抽象類定義的類。
Ⅳ php 類的繼承問題
在PHP中類的繼承是使用最多的一個編程特性,我們可以創建一個基類(父類)然後在這其中定義一些基本的方法,在我們的子類我們可以擴展父類中的方法這就叫覆蓋,但是如果說你在父類的某些很關鍵的方法你不能被子類繼承,因為如果子類繼承了這個方法可能給程序帶來一定的麻煩,所以我們希望這個方法是「私有」的,是不能被擴展的,這在PHP使用了final關鍵字來修飾你要不被繼承的方法。
PHP final關鍵字可以修飾類同樣可以修改類中的方法,但它們的作用是差不多的,即如果你使用了final關鍵字來修飾了,那麼這個被修飾的類或者方法將不能被擴展或者繼承。你只能老老實實去引用它。如果你在類前面使用了final,這就是說明這個類不能使用繼承;如果你在方法前使用了PHP final關鍵字,這就是說明這個方法不能被覆蓋。
簡單的說,final就是防止父類覆蓋的,加上它就不會被父類覆蓋
Ⅳ php繼承問題
上面這個例子中B基本上是不存在意義的,也就是無的過程,下面是程序運行過程中B完全沒有參與,在$b = new B("b_1", "b_2"),B繼承A,然後運行A的構造函數(B沒有自己的構造函數)。在$b->print_other($a); 一行中,運行的A的print_other函數,這個是公共函數,請看函數的定義
public function print_other(A $other),這里有類型暗示,也就是函數接受的參數是A類,所以print_other函數使用的參數也是A類,而不是B,B沒有直接調用$priv。$priv 不能被繼承,但是可以在父類中被調用和輸出,只是不能直接用B來訪問,B實例化的時候A同樣被實例化了,不然如何能夠調用父類的屬性
下面是這個程序運行過程
0.0014 70936 +712 -> A->__construct($a = 'a_1', $b = 'a_2')
0.0015 71304 +368 -> A->__construct($a = 'other_a_1', $b = 'other_a_2')
0.0016 71680 +376 -> A->__construct($a = 'b_1', $b = 'b_2')
0.0016 71824 +144 -> A->print_other($other = class A { protected $prot = 'a_1'; private $priv = 'a_2' })
0.0017 71928 +104 -> A->print_other($other = class B { protected $prot = 'b_1'; private ${A}:priv = 'b_2' })
0.0018 71928 +0 -> A->print_other($other = class A { protected $prot = 'a_1'; private $priv = 'a_2' })
Ⅵ php 繼承
<?php
class User{
protected $email;
protected $password;
function __construct($email,$password){
$this->email=$email;
$this->password=$password;
}
}
class Admin extends User{
public $author;//建議var不要再用了
function __construct($email,$password,$author){
parent::__construct($email,$password);//這里要加參數
$this->author=$author;
}
function getEmail(){
return $this->email;
}
}
$admin = new Admin([email protected]','aa',1);
echo $admin->getEmail();
?>
Ⅶ 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中類的繼承是有什麼用處哪位有案例分析一下謝謝
我們可以寫一些公共類,讓其他類繼承,
比如程序中經常會用到的一些邏輯或演算法或公共方法
將他們包進類裡面,可以提升程序的效率,減少代碼的重復
Common.class.php
<?php
/**
*公共處理類
*/
classCommon{
protected$DB;
publicfunction__construct(){
session_start();
$this->DB=mysql_connect('localhost','root','')ordie('Couldnotconnecttoserver');
mysql_select_db('wordpress',$this->DB)ordie('Couldnotselectdatabase');
}
?>
Register.class.php
<?php
requireClASSPATH.'Common.class.php';
classRegisterextendsCommon{
}
望採納 Thx
Ⅸ php 繼承問題 私有的能不能繼承啊到底
在php中類的繼承是使用最多的一個編程特性,我們可以創建一個基類(父類)然後在這其中定義一些基本的方法,在我們的子類我們可以擴展父類中的方法這就叫覆蓋,但是如果說你在父類的某些很關鍵的方法你不能被子類繼承,因為如果子類繼承了這個方法可能給程序帶來一定的麻煩,所以我們希望這個方法是「私有」的,是不能被擴展的,這在php使用了final關鍵字來修飾你要不被繼承的方法。
php
final關鍵字可以修飾類同樣可以修改類中的方法,但它們的作用是差不多的,即如果你使用了final關鍵字來修飾了,那麼這個被修飾的類或者方法將不能被擴展或者繼承。你只能老老實實去引用它。如果你在類前面使用了final,這就是說明這個類不能使用繼承;如果你在方法前使用了php
final關鍵字,這就是說明這個方法不能被覆蓋。
簡單的說,final就是防止父類覆蓋的,加上它就不會被父類覆蓋
Ⅹ php繼承中方法重載(覆蓋)的應用場合
本文實例分析了php繼承中方法重載(覆蓋)的應用場合。分享給大家供大家參考。具體分析如下:
方法重載(override)/覆蓋——在什麼情況下使用:當父類知道所有的子類都需要用到一個方法,但父類不知道怎麼去寫這個方法時,就需要用到方法的重載。這時候,可以讓子類去重寫,來覆蓋這個方法。
通俗實例——父類(動物)知道其子類(貓和狗)都會叫,但它們的叫法都不一樣,所以父類沒法去寫這個方法,只能讓子類(貓和狗)去定義。代碼如下:
<?php
class
Animal{
public
$name;
protected
$price;
function
cry(){
echo
"不知道動物怎麼叫";
}
}
class
Dog
extends
Animal{
function
cry(){
echo
"汪汪...";
}
}
class
Pig
extends
Animal{
function
cry(){
echo
"哼哼..."
}
}
?>
方法重載/覆蓋的要點與細節(讀起來有點呦口):
1、要求子類的方法,其方法名稱、參數列表與父類方法一模一樣。如例子中cry(),不能添加參數,改成cry($naaa)等。注意:這里並不要求參數名一樣,只是要求參數的個數是一樣的。
2、所謂的重載或覆蓋,並不是將父類的方法覆蓋。也可以這么理解:如果子類有調用該方法時,如果在自己類里找不到這個方法,那麼它會去找父類里,看有沒有這個方法。這也是多態的理解
3、如果子類里某個方法,要把父類里相同名稱方法里的內容繼承下來,可以使用
parent::方法名
或
父類名::方法名
繼承。在子類定義的方法內使用。
4、訪問許可權問題,子類的訪問范圍>=父類的訪問范圍,即如果父類是protected
function
cry(),子類則只能是protected或public。
希望本文所述對大家的php程序設計有所幫助。