Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果实用程序类是反模式的,那么PHP中的替代方案是什么?_Php_Oop_Design Patterns_Anti Patterns_Utility Method - Fatal编程技术网

如果实用程序类是反模式的,那么PHP中的替代方案是什么?

如果实用程序类是反模式的,那么PHP中的替代方案是什么?,php,oop,design-patterns,anti-patterns,utility-method,Php,Oop,Design Patterns,Anti Patterns,Utility Method,我正试图通过遵循最新的OOP设计模式来构建自己的MVC框架(当然是为了更好地学习它)。我想知道,放置可重复代码的最佳实践是什么?(它被用来作为静态方法留在实用程序类中,这不是一个好的模式)。 例如,我们希望使用点分隔字符串遍历多维数组,我必须在几个类中使用该算法(这些类是其他基类的子类)。我如何在不使用实用程序类和不多次重复相同代码的情况下做到这一点 实用程序类没有错,只是不要将所有不相关的实用程序函数都放在一个大类中。通过它们的行为将它们分开(和命名空间)。例如,请参阅或 或者,如果需要该函数

我正试图通过遵循最新的OOP设计模式来构建自己的MVC框架(当然是为了更好地学习它)。我想知道,放置可重复代码的最佳实践是什么?(它被用来作为静态方法留在实用程序类中,这不是一个好的模式)。
例如,我们希望使用点分隔字符串遍历多维数组,我必须在几个类中使用该算法(这些类是其他基类的子类)。我如何在不使用实用程序类和不多次重复相同代码的情况下做到这一点

实用程序类没有错,只是不要将所有不相关的实用程序函数都放在一个大类中。通过它们的行为将它们分开(和命名空间)。例如,请参阅或

或者,如果需要该函数的类都有一个公共父类,则可以将该函数放在最顶层的类或抽象中


或者,如果这些类没有共同的父类,您可以使用名为
extractArrayFromDottedString()
或类似的方法创建一个Trait。

实用程序类没有问题,只是不要将所有不相关的实用程序函数合并到一个巨大的类中。通过它们的行为将它们分开(和命名空间)。例如,请参阅或

或者,如果需要该函数的类都有一个公共父类,则可以将该函数放在最顶层的类或抽象中


或者,如果这些类没有公共父类,则可以使用名为
extractArrayFromDottedString()
或类似方法创建Trait。

Laravel通过定义独立的“helper”函数来实现这一点。CakePHP和Yii通过使用静态方法定义容器实用程序类(即“文本”或“Xml”)来实现。编程语言也做类似的事情(例如PHP的
infrade()
、Java的
Math.round
、C的
strcpy
、Python的
sum()
,等等)。几乎所有东西都使用独立函数或静态类方法


最终,最好的选择是主观的。这取决于你想如何组织事情。研究PHP中常见的设计模式,了解不同框架在实践中的感受。然后选择一种方法并保持一致。

Laravel通过定义独立的“助手”函数来实现这一点。CakePHP和Yii通过使用静态方法定义容器实用程序类(即“文本”或“Xml”)来实现。编程语言也做类似的事情(例如PHP的
infrade()
、Java的
Math.round
、C的
strcpy
、Python的
sum()
,等等)。几乎所有东西都使用独立函数或静态类方法

最终,最好的选择是主观的。这取决于你想如何组织事情。研究PHP中常见的设计模式,了解不同框架在实践中的感受。然后选择一种方法并保持一致

实用程序类是一种反模式

真的没有。
在OOP中,使用实用程序类设计整个应用程序很可能是一种反模式,但使用提供常规/横向任务的
静态
方法定义实用程序类可能是有意义的。

不将实用程序方法与使用它们的现有类的方法混合,也可以提供实用程序类和使用者类更好的内聚性和可重用性。

当然,您也可以使用实例方法定义一个类。
这是有效的,更详细,但有利于提高类的可测试性。如果您需要模拟调用或切换到实用工具方法的其他实现,则必须使用实例方法

实用程序类是一种反模式

真的没有。
在OOP中,使用实用程序类设计整个应用程序很可能是一种反模式,但使用提供常规/横向任务的
静态
方法定义实用程序类可能是有意义的。

不将实用程序方法与使用它们的现有类的方法混合,也可以提供实用程序类和使用者类更好的内聚性和可重用性。

当然,您也可以使用实例方法定义一个类。

这是有效的,更详细,但有利于提高类的可测试性。如果需要模拟调用或切换到实用程序方法的其他实现,则必须选择实例方法。

如果这些是实用程序函数,则在单独的命名空间中定义它们。类似于

<?php
namespace Utils;

function array_query($array, $query) {
   // code for traversing the array 
}
这些重复的“域逻辑”片段应该放在单独的实体中,然后您可以为其他类键入提示。然后你在某处将其用作:

public function register(EmailAddress $email, SafePassword $password): User
{
   // your user registration logic
}
这样,您的各种服务都可以执行活动,您可以使用
try-catch
改进验证

p.S.
你可能需要仔细看看你在做什么。点式访问实用程序非常简洁(我10年前也使用过它),但实际上它是一个更深层问题的“临时修复”:您不应该处理太深的数组,需要简化对它们的访问


如果这些是实用程序函数,则在单独的命名空间中定义它们。类似于

<?php
namespace Utils;

function array_query($array, $query) {
   // code for traversing the array 
}
这些重复的“域逻辑”片段应该放在单独的实体中,然后您可以为其他类键入提示。然后你在某处将其用作:

public function register(EmailAddress $email, SafePassword $password): User
{
   // your user registration logic
}
这样,您的各种服务都可以执行活动,您可以使用
try-catch
改进验证

p.S.
你可能需要仔细看看你在做什么。点式访问实用程序非常简洁(我10年前也使用过它),但实际上它是一个更深层问题的“临时修复”:您不应该处理太深的数组,需要简化对它们的访问

如果你有