在我用OOP重写我的过去项目的过程中,我将代码分解为设备,设施等类。
在转向更面向对象的方法之前,我只是将所有辅助函数都放在一个包含的“functions.php”文件中。以Devices为例,最好为我的对象特定属性/方法设置Devices类,然后有一个DeviceManager类来存储getDeviceByName,getDeviceByID等函数吗?
根据我的理解,OOP更多的是关于可读性/可管理性,为什么我认为目的只是使用类似DeviceManager :: GetDevice(“Computer1”)代替GetDeviceByName(“Computer1”)
答案 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作为静态函数时的一些优点。
命名空间和类名称有助于区分功能。您可以避免命名冲突。
当您想要利用IDE的自动建议时,DPDate :: FirstDayOfMonth()优于FirstDayOfMonth()。
答案 3 :(得分:-2)
您必须遵守以下规则:
记住这些事情,你会做一个干净的代码。 =)
回答关于第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);