2011-07-22 64 views
3

超類的我有3個班,以下繼承結構:如何從子類訪問PHP

<?php 
    class admin { 
     function __construct($module){ 
     echo $module; 
     } 
    } 

    class user_admin extends admin { 
     function __construct(){ 
     parent::__construct('user'); 
     } 
    } 

    class sales_admin extends user_admin { 
     function __construct(){ 
     parent::__construct('sales'); 
     } 
    } 

你會發現sales_admin擴展user_admin,這是一個nescessary一步。當我運行這段代碼,

$a = new sales_admin; 

將回聲「用戶」,因爲它傳遞了「銷售」字符串不接受構造的user_admin。

有沒有辦法在不改變user_admin的情況下訪問上面父級的構造函數,而我沒有控制權?

+0

需要實際的代碼和您遇到的問題。你想回應'銷售'?你應該有讓你改變其他東西的getter和setter,除非父母靜態地做事情,然後你只是失去了運氣並且破壞了面向對象的目的。 – iLLin

回答

1

就直接引用類:

class sales_admin extends user_admin 
{ 
    function __construct() 
    { 
     admin::__construct('sales'); 
    } 
} 

$a = new sales_admin; // outputs 'sales' 

由於user_admin延伸管理和sales_admin延伸user_admin,sales_admin將有管理員構造

+0

sales_admin可以調用admin :: __ construct(),但是sales_admin是admin的後代這一事實並不是原因。在範圍參數上,admin的構造函數是公共的,因此可以在任何地方訪問。 – erisco

+0

在這個例子中,它可能是,你是對的,但在普通應用程序中,如果'sales_admin'不是後代,'admin'類將不得不包含在內。我的頭腦走了一條路,你走了另一條路。對於OP來說,兩者都有好處,我猜想:) – AlienWebguy

+0

爲了澄清,如果admin類未包含在內,sales_admin不能擴展admin。 – erisco

0
//super implimentation php 

class object extends other_object { 
    function __construct(){ 
     $this->super(); 
    } 

    function super() { 
     $parentClass = get_parent_class($this); 
     $this->$parentClass(); 
    } 
} 
+0

好主意,但我無法編輯user_admin類或管理員類... –

0

sales_admin知道它的範圍有,因爲它父正在擴展user_admin。但是,sales_admin如何知道user_admin是否有父級?在PHP中,sales_admin沒有辦法知道 - 除非你用反射作弊。

你有一個選項是借用管理員的構造函數。您可以撥打admin::__construct('sales');來完成此操作。請注意,無論繼承樹如何,您都可以借用任何類的方法 - 也就是說,調用方不必是被調用方的後代。

儘管有這個選項,我仍然建議改變你的設計,讓你可以完全避免繼承。