Tji*_*irp 14 php oop static-methods
和同事讨论过这是不好的做法.现在我在网上找不到这个例子.
我们有很多数据库对象映射器,并且像这样调用它的函数
(示例) - setId方法获取数据库中的行并将其设置为预定义的属性
class Person {
public static function get($id) {
$object = new Person;
$object->setId($id);
return $object;
}
}
Run Code Online (Sandbox Code Playgroud)
像这样使用它我们可以使用这样的简单结构:(我们从例如一个帖子得到id)
$person = Person::get($id);
Run Code Online (Sandbox Code Playgroud)
代替
$person = new Person;
$person->setId($id);
Run Code Online (Sandbox Code Playgroud)
现在,我的直觉告诉我这是不好的做法.但我无法解释.也许有人在这里可以解释为什么这是,或者不是不好的做法
以下是我们如何使用它的一些其他示例.我们主要用它来吸气.(只是名称,而不是代码.几乎所有这些都只运行一个查询,它可以返回1个对象,然后使用结果的id来使用setId方法)
class CatalogArticle {
public static function get($id) { }
public static function getByArticlenumber($articlenumber) {} //$articlenumber is unique in the database
public static function getRandom() {} //Runs a query returning a random row
}
Run Code Online (Sandbox Code Playgroud)
irc*_*ell 14
这不是可怕的坚持.它是Factory Method设计模式的实现.原则上它一点都不差.
但是,在你的具体例子中,它并没有真正做任何重要的事情,所以我不确定是否有必要.您可以通过将(可能是可选的)参数添加到id的构造函数来消除这种需要.然后任何人都可以打电话$foo = new Person($id);而不需要明确的工厂.
但是,如果实例化很复杂,或者您希望能够构建几个只能由逻辑确定的不同人员类型,那么工厂方法可能会更好.例如,假设您需要确定某个参数实例化的人员类型.然后,工厂方法就Person合适了.该方法将确定要加载的"类型",然后实例化该类.
一般来说静态很难测试,并且不允许像实例那样进行多态变化.它们还在代码中的类之间创建硬依赖关系.它们并不可怕,但如果你想使用它,你应该考虑一下.一个选项是使用Builder或Abstract Factory.这样,您创建构建器/工厂的实例,然后让该实例确定如何实例化生成的类...
另一个说明.我会将该方法重命名Person::get()为更符合语义的东西.也许Person::getInstance()或其他合适的东西.
这篇博文应该告诉你为什么人们不喜欢静态方法比我更好:
http://kore-nordmann.de/blog/0103_static_considered_harmful.html
关于你当前代码片段最让我印象深刻的问题:是否允许一个人没有ID?
我觉得如果它代表一个真人,那应该是一个构造函数参数.如果您使用该类创建可能无法工作的新人.
两个电话之间的差异很小.两者都"创建"一个Person类并设置Id,这样当你遇到"硬连线依赖"时你就不会赢得/失去任何东西.
优势仅显示当您希望能够将Person传递到另一个对象并且对象需要更改ID时(例如,博客文章应该比我在这里更好地解释).
| 归档时间: |
|
| 查看次数: |
5598 次 |
| 最近记录: |