辅助函数应该属于一个类吗?

时间:2014-01-18 13:27:06

标签: php function oop

在我用OOP重写我的过去项目的过程中,我将代码分解为设备,设施等类。

在转向更面向对象的方法之前,我只是将所有辅助函数都放在一个包含的“functions.php”文件中。以Devices为例,最好为我的对象特定属性/方法设置Devices类,然后有一个DeviceManager类来存储getDeviceByName,getDeviceByID等函数吗?

根据我的理解,OOP更多的是关于可读性/可管理性,为什么我认为目的只是使用类似DeviceManager :: GetDevice(“Computer1”)代替GetDeviceByName(“Computer1”)

4 个答案:

答案 0 :(得分:2)

如果您正在考虑将类用作命名空间,那么您也可以使用实际的命名空间:

namespace MyCollectionOfFunctions;
function printMyName($name) {
    echo $name;
}

然后你可以使用这样的函数:

use MyCollectionOfFunctions as fn;
echo fn\printMyName('Brett Powell');

功能没有问题。不要让任何人告诉你他们属于一个类,作为静态方法。 可以以这种方式完成,但由于我们获得了命名空间,因此没有理由。

答案 1 :(得分:1)

在像C#或Java这样的OOP语言中,你根本无法在类之外拥有函数,所以没有问题。这并不意味着你在做OOP,这是一种心态。

在PHP中,您可以将相关函数放入nampespace或类(在命名空间内)。这取决于你,没有正确或错误的方法。就个人而言,我会把它们放到一个类中,因为这就是我在C#中的表现,它对生产力有所帮助:我将相关功能分组到一个地方(类)。它更容易管理。

但是从编程的角度来看,没有区别,你的代码不会更干净/解耦或更多OOP,因为你已经将函数放入类或命名空间

答案 2 :(得分:0)

使用Namespace或Class作为静态函数时的一些优点。

  1. 命名空间和类名称有助于区分功能。您可以避免命名冲突。

  2. 当您想要利用IDE的自动建议时,DPDate :: FirstDayOfMonth()优于FirstDayOfMonth()。

  3. 这完全是关于凝聚力和脱钩的。

答案 3 :(得分:-2)

您必须遵守以下规则:

  1. 在OOP中你必须始终使用CLASS
  2. 您的方法必须具有单一责任
  3. 避免使用通用助手类,类必须具有简单且具体的责任感
  4. 不要使用静态方法,使用策略(传递对象抛出param)来调用方法,这样就可以创建一个Mock来测试你的方法。
  5. 避免使用私有方法,这会让您难以测试您的课程
  6. 记住这些事情,你会做一个干净的代码。 =)


    回答关于第4项的Eric:这段代码将使用静态方法:

    public function myFunction() {
        $deviceId = DeviceManger::getDeviceId('computer 1');
        // Rest of code using the device id 
    }
    

    这样我就无法模拟设备ID的返回,这样我就可以:

    public function myFunction(deviceManger) {
        $deviceId = deviceManager->getDeviceId('computer 1');
        // Rest of code using the device id 
    }
    

    测试函数中带有mock的代码:

    $deviceManager = $this->getMock('DeviceManager');
    $deviceManager->method('getDeviceId')->returnValue(1);
    myFuncion($deviceManager);