2017-08-09 269 views
-1

我该如何在php中编写这段代码?在不创建实例的情况下创建一个类?

Database::select("podomoro")->table("blog")->get(); 

Database::table("blog")->select("podomoro")->get(); 

第二方法可能会改变,数据库类后。

+0

打开laravel资源并查看。 –

+0

你其实不应该写这些。因为每条线都有多个反模式。 –

+1

@u_mulder“从laravel学习”对于新手和一般的愚蠢建议都具有破坏性。 –

回答

1

我会拆分此代码到行:

Database::select("podomoro") 
    ->table("blog") 
    ->get(); 

第一行基本要求的一类数据库的静态方法。这个静态方法返回一个对象实例(可能 - 种类的SELECT对象)。该对象有方法table()(可能在其他许多方面)。

在第二行上,您将调用第一行返回的对象的方法table()。此方法执行某些操作并返回另一个对象实例。当您可以创建方法调用链时,这用于“流畅”接口。

第三行调用方法get()对从第二行调用的函数返回的对象。

的这个最简单的实现将是:

<?php 

class Database 
{ 
    public static function select($something) 
    { 
     // Do something meaningfull 
     return new Query(); 
    } 
} 

class Query 
{ 
    public function table($name) 
    { 
     // Do something meaningfull 
     return $this; 
    } 

    public function get() 
    { 
     // Do something meaningfull 

     return $this; 
    } 
} 

,如在评论中提到别人,这种模式往往是过度使用和 - - 事实上往往成为反模式。对于现代框架(如Symfony2等),您应该使用依赖注入和服务实例。

流利的接口也不鼓励。您应该主要在实施builder模式时使用它们 - 例如。 QueryBuilder在学说等

至于我,我不建议使用静态类方法,如果你不知道,你在做什么。我使用它们主要是为了重载类构造函数(我创建了私有类构造函数和几个静态方法,并使用不同的参数来创建类实例)。最近我已经使用它,将DI集成到没有这种功能的旧框架中时--DI对象本身就是一个单例,并且有一个静态的方法getInstance()。不过,我并不为此感到自豪。

+0

我个人建议改为编写自定义[数据映射器](https://martinfowler.com/eaaCatalog/dataMapper.html)。 –

0

我已经找到了这个问题的答案。 @ tomasz-struczyński的方法也是如此。

class PhoneNumber 
    { 
     protected $number; 
     protected $countries = []; 
     protected $country; 
     public function __construct($number) 
     { 
      $this->number = $number;     
     } 

     public static function make($number, $country = []) 
     { 
      $instance = new static($number); 
      return $instance->ofCountry($country); 
     } 

     public function ofCountry($country) 
     { 
      $countries = is_array($country) ? $country : func_get_args(); 
      $instance = clone $this; 
      $instance->countries = array_unique(array_merge($instance->countries, $countries)); 
      return $instance; 
     } 
    } 

    echo "<pre>"; 
    $dd=PhoneNumber::make(100,"TR")->ofCountry('BE'); 
    print_r($dd); 
相关问题