我该如何在php中编写这段代码?在不创建实例的情况下创建一个类?
Database::select("podomoro")->table("blog")->get();
或
Database::table("blog")->select("podomoro")->get();
第二方法可能会改变,数据库类后。
我该如何在php中编写这段代码?在不创建实例的情况下创建一个类?
Database::select("podomoro")->table("blog")->get();
或
Database::table("blog")->select("podomoro")->get();
第二方法可能会改变,数据库类后。
我会拆分此代码到行:
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()
。不过,我并不为此感到自豪。
我个人建议改为编写自定义[数据映射器](https://martinfowler.com/eaaCatalog/dataMapper.html)。 –
我已经找到了这个问题的答案。 @ 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);
打开laravel资源并查看。 –
你其实不应该写这些。因为每条线都有多个反模式。 –
@u_mulder“从laravel学习”对于新手和一般的愚蠢建议都具有破坏性。 –