繁体   English   中英

php oop 类调用内部函数

[英]php oop classes call inside functions

所以我有一个 class 包含基本的东西,比如

Class Test{
   public function wheels(){
        echo 'wheels';
   }
}

还有一个

Class Test2{
   public function bikes(){
       $test = new Test();
       return 'i am a bike with '.$test;
   }
}

所以我的问题是,如果我在 function 中需要不同的类,将其称为 $var = new ClassName(); 是一种好习惯吗?

或者有更好的方法在类函数中调用不同的类?

不,这样做很好。 我能给你的唯一建议是分配这样的变量:

$modelClass = new ModelClass();

但是您需要将您的列表更改为:

Class Test{
   public function wheels(){
        return 'wheels';
   }
}

Class Test2{
   public function bikes(){
       $test = new Test();
       return 'i am a bike with '.$test->wheels();
   }
}

为您的 web 应用程序编写一个自动加载器,它只是从您想要在需要时使用的文件中加载所有类。

然后,您可以只编写您想要的代码,而无需在类之间构建复杂的 inheritance 只是因为您想利用您编写的功能。

这有很多好处:

  1. 即使在 OOAD 方面没有太多经验,您也可以通过引入多个类之间的太多关系来将内容彼此分开。 类之间的关系可能很糟糕,因为您在不需要时让事物相互依赖。
  2. 您可以轻松扩展和更改您的应用程序。 这很重要,因为您继续编码,无论是现在还是以后。

那只是我的2美分。 如果你以后不喜欢自动加载器,你也可以改变它。 但它有助于让事情直截了当。

例子:

function my_autoloader_function($name) {
    require(sprintf('%s/%s.php', $yourlibfolderdir, $name));
}
spl_autoload_register('my_autoloader_function');
// [...] (even in other files)
$obj = new Test5;
$obj->funcZalabri();

注册的自动加载器 function 每次在 class 不存在时被实例化/访问时都会被调用。 在示例中,假设每个文件有一个 class,这很常见,我认为管理代码非常好。

由于自动加载器是一个回调并且它是用 PHP 编写的,因此您可以在其中做任何您想做的事情,并使其更加详细以满足您的需求。

希望这可以帮助。

这是一般面向对象中的常规做法,而不仅仅是在 PHP 中。 如果您需要$test不仅仅是Test2.bikes() ,那么您应该将其声明为Class Test2的全局变量。

您的代码当然是合法的(除了需要像 Tomasz 提到的那样调用$test->wheels之外)对于许多 OOP 语言,但是,您在构造函数中指定内容,然后在方法调用中使用它们:

Class Test2{
   private $test;

   function __construct($test) {
       $this->test = $test;
   }
   public function bikes(){
       return 'i am a bike with '.$this->test->wheels();
   }
}

如果您想动态更换车轮,则尤其如此。

这就是你通常的做法。 虽然,如果您在 class 的其他函数中需要新的 class,您可能希望在函数之外实例化它一次,而不是每次都创建一个新的 object。

这取决于您需要的 class,以及您需要它的方式以及为什么需要它。 如果您需要一个全新的副本,每次 function 运行时,您可能希望按照自己的方式进行操作。 如果您不需要新副本(这就是您正在做的事情,如果您需要干净的副本,那么您做了!!) ,但只需要访问一些独立的方法,您可以考虑制作子 class class 的子元素。

例如,如果你正在做更多的 .net 风格 OOP 你可以有这样的事情。 其中既有 styles 又有 OOP。 我意识到这不是表示 DOM 的有效或正确方式,但这是一个示例。

class Entity
{
    private $children = array();

    public addChild(Entity $entity) { ... }
    public getChild($index) { ... }
    public removeChild($index) { ... }

}

class Text : Entity //this is inheritence
{
    private $text;

    public setText($text) { ... }
    public getText() { ... }
}

class Attributable : Entity
{
    protected $attributes = array();

    public setAttribute($key, $value) { ... }
    public clearAttribute($key) { ... }
    public getAttribute($key) { ... }
}

class Option : Attributable
{  
    public $text = new Text(); //this is a child element
}

class Select : Attributable
{
    portected $options = array();

    public addOption(Option $entity) { ... }
    public getOption($index) { ... }
    public removeOption($index) { ... }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM