2013-03-13 39 views
-1

我想发明一个私人框架来构建未来的PHP应用程序。我的示例代码是:如何从父类调用子类功能PHP

class system { 
    const token = "1234"; 
} 

class data extends system { 
    public $driver = "mysql"; 

    function get_name() { 
     if (parent::token == "1234") { 
      return "John"; 
     } 
    } 
} 

class about extends system { 
    public $version = "10.1"; 
    function get_build() { 
     if (parent::token == "1234") { 
      return "920"; 
     } 
    } 
} 

我的问题是我可以调用包含类结构的子函数。我不知道这是什么名字。我想像这样。

$system = new system(); 

echo $system->data->driver; // Output "mysql" 
echo $system->data->get_name(); // Output "John" 
echo $system->about->version; // Output "10.1" 

在LUA的代码是这样的:

system = {}; 

system.token = "1234"; 
system.data.driver = "mysql"; 

function system.data.get_name() 
    if (system.token == "1234") then 
     return "John"; 
    end 
end 

system.about.version = "10.1"; 

function system.about.get_build() 
    if (system.token == "1234") then 
     return "920"; 
    end 
end 

用法:

name = system.data.get_name() -- variable "name" value will be "John" 

感谢。

编辑:

该代码只是为了展示一下我想要实现的,因为我刚开始在PHP中的工作样本。 Usualy我正在使用LUA。我的计划是构建易于使用且易于理解的框架。所以人们将可以轻松地构建应用程序,并且可以轻松记住函数引用。例如:

$tbl_result = $system->data->select("name", "table", "id='10'");

该代码而无需查询用于容易选择数据从数据库。返回值是数组列表。此功能也会自动从配置中检测数据库驱动程序。所以用户不需要在特定的驱动程序中知道SQL查询。但是调用函数的方法应该是结构化的。为什么我必须使用system-> data->函数?因为我将以root身份拥有系统,组件和模块。那么每个根都会有很多孩子。例如,系统将具有核心,数据,模型等。也许在每个根中将具有相同的子名称。所以这就是为什么我必须建立这个结构。

回答

0

这不完全如何OOP在PHP中工作,并不是一般OOP。

如果要访问所有的子类的子功能,你不希望实例要实例化一个关于对象的系统对象:

$system = new about(); 
echo $system->driver; // Output "mysql" 
echo $system->get_name(); // Output "John" 
echo $system->version; // Output "10.1" 

我会做PHP OOP一些阅读虽然。

+0

是的,我知道这一点。这就是我通常所做的。但我想我的代码结构很容易理解。如果我使用'$ system-> driver',那么如果有人读过这个代码,他们会认为“驱动程序”是系统驱动程序,而不是数据驱动程序。但是如果我可以使用像LUA('system.data.driver')这样的结构,那么读取该代码的人会认为“驱动程序”是数据的孩子,而不是系统的孩子。如果在PHP中不可行,那么我将使用一般方法。 :) – 2013-03-13 02:05:34

1

我没有看到任何理由,数据类和关于类应该从系统类扩展。您可以改为执行以下操作。

class data { 
    public $driver = 'mysql'; 
    public $token; 
    function __construct($token) 
    { 
     $this->token = $token; 
    } 
    function get_name() { 
     if ($this->token == "1234") { 
      return "John"; 
     } 
    } 
} 

class about { 
    public $version = "10.1"; 
    public $token; 
    function __construct($token) 
    { 
     $this->token = $token; 
    } 
    function get_build() { 
     if ($this->token == "1234") { 
      return "920"; 
     } 
    } 
} 

class system { 
    public $token; 
    public $about; 
    public $data; 

    function __construct($token) 
    { 
     $this->token = $token; 
     $this->about = new about($this->token); 
     $this->data = new data($this->token); 
    } 
} 

然后你可以做这样的事情。

$system = new system('1234'); 
echo $system->data->driver; // Output "mysql" 
echo $system->data->get_name(); // Output "John" 
echo $system->about->version; // Output "10.1" 

我只是表明这是做你想达到的一种方式。然而,在做任何事情之前,我会重新考虑你的框架的设计和结构。

+0

是的,这对我很有帮助。谢谢。 – 2013-03-13 02:18:36

+0

通过这种方式,你会得到多个'$ token'变量,这意味着使用更多的内存。我了解@NanangElSutra,使用继承将防止创建新的变量,对象。为了解决这个问题,你可以为你希望从子类的父类访问的方法设置'static'。你可以像访问它们:'data :: get_name()' – TomSawyer 2016-11-03 09:33:03