为什么使用PHP OOP的基本function和什么时候?
有关于这个问题的一些post,但我没有明确得到什么时候使用面向对象的编码,以及何时使用包含编程function。 有人还向我提到,OOP运行起来非常沉重,工作量大。 这是正确的吗?
比方说,我有一个50个function的大文件。 我为什么要在课堂上叫这些? 而不是由function_name()? 我应该切换并创build一个拥有我所有function的对象吗? 什么是优势或特定的区别? 它在PHP中编写OOP有什么好处? 模块化?
在很多场景中,程序编程都很好。 为了使用OO而使用OO是毫无用处的,特别是如果你只是要结束POD对象(plain-old-data)。
面向对象的力量主要来源于inheritance性和多态性。 如果你使用类,但从来没有使用这两个概念,你可能不需要首先使用类。
OO闪耀的最好的海事组织之一是让你摆脱开关式的代码。 考虑:
function drive($the_car){ switch($the_car){ case 'ferrari': $all_cars->run_ferrari_code(); break; case 'mazerati': $all_cars->run_mazerati_code(); break; case 'bentley': $all_cars->run_bentley_code(); break; } }
与其OOselect:
function drive($the_car){ $the_car->drive(); }
基于运行时信息,多态性将允许适当types的“驾驶”发生。
关于多态性的说明:
这里的第二个例子有一些前提:那就是所有的汽车类将会扩展一个抽象类或者实现一个接口 。
两者都允许您强制扩展或实现类来定义特定的function,如drive()
。 这是非常强大的,因为它可以让你drive()
所有的汽车,而不必知道你正在驾驶哪一辆; 这是因为它们扩展了一个包含drive()
方法的抽象类,或者实现了一个强制定义drive()
方法的接口。
所以只要你确定所有你的特定汽车要么扩展抽象类car
要么实现一个接口,比如canBeDriven
(两者都必须声明 drive()
方法),你可以直接调用drive()
方法,你知道是一辆汽车(但不是什么types的汽车),不用担心它没有被定义,因为PHP会给你带来致命的错误,直到你在你的特定的汽车类中定义这些方法。
在程序中使用面向对象的编程方法而不是程序编程的方法并不是真的依赖于语言(不pipe它是否是PHP),而是取决于你试图解决的问题types。
(我只是在我的例子中使用伪代码,因为我不太熟悉PHP。)
例如,如果你有一个程序,你只是在执行一堆function,那么程序将会很好。 例如,如果这是一个简单的string操作程序,程序方法就足够了:
perform_truncation(my_string, 10) to_upper(my_string) perform_magic(my_string, hat, rabbit)
但是,如果要处理许多不同的项目(例如文件或其他任何对象的表示),那么面向对象的方法会更好。
例如,如果你有一堆Car
并希望他们drive
,那么在程序上,你可以做一些事情:
drive_car(first_car) drive_car(second_car)
在OOP中, Car
可以自己驾驶:
RedCar myRedCar(); BlueCar myBlueCar(); myRedCar.drive(); myBlueCar.drive();
而且,由于每辆车是不同的class级,他们的行为可以有不同的定义。 此外,他们可能是两个子类或Car
他们可能有共同的function。
这实际上归结为使程序方法比面向对象更好的问题types,反之亦然。
除了程序或面向对象的问题外,它可能是一种具有多个function的源文件的“代码味”。 对于包含许多function的类,也可以这样说,这些function在单独的类中可以更好地作为单独的function来执行。
这里的问题可能是代码组织,而不是决定select程序或面向对象的编程。 将function组织成单独的源文件可能是放弃编写程序的程序方法所需要的。
毕竟,程序编写的程序很多,写得很好,维护也很方便。
我会尽量把我的答案作为一个补充,因为马泰德·塔比和科比德的回答非常好。
我大部分时间都是一个程序编程人员,并没有与OOP编程作斗争,但是从来没有真正看到过多的相关性……直到我开始一个团队的工作和build立更重要和复杂的项目。
在我看来,当你需要为更复杂的应用程序编写精简且易于维护的代码时,OOP真的很闪耀。 请记住,不是在任何情况下,但有一些地方,程序就不会那么好。
我的大多数OOP实现的例子都是针对那些项目,我有几个相关但都略有不同的东西。 网站forms繁多,用户众多,产品众多
它们都具有相似的行为名称,如print(),update()等等,但是通过将它们封装为对象并改变类中的方法实现,我可以在运行时使我的代码在整个站点中变得非常简单和干净。 而且,这个是关键,尽pipe有不同的行为,但我可以在整个应用程序中使用相同的方法调用不同的对象。 它允许第二个开发人员在处理更深层次的代码时处理实际的实现。
我不知道这是否有助于任何人,而不是在很久以前处于你的处境的人说话,我喜欢OOP。
假设我有一个50个函数的大文件,为什么我要在一个类中调用这些文件? 而不是由function_name()。 我应该切换并创build包含我所有function的对象吗?
移动到OOP不应该被看作是一个简单的“开关”,就像你上面描述的那样。
面向对象程序devise需要一种完全不同的思维方式来重新编程你的大脑。 由于重新连线大脑不会在一夜之间发生,许多人不愿意将自己暴露于所需的重新布线过程中。 不幸的是,重新布线要投入时间和精力:研究,教程,试验和错误。
这实际上涉及退后一步,了解OOP背后的概念,但是回报将是值得的,就像在pre www时期经历这个过程的人一样。
在你“得到它”之后,在你的日常生活中遵循面向对象的最佳实践,你会告诉别人你的编程生活是如何变好的。
一旦你真的了解面向对象,你将会回答你自己的问题。
如果你有50个function,而不是50个静态方法进入Utilities类,你会“污染”全局命名空间。
使用具有50个静态方法的类,方法名称是本地的类。
我不能说哪一个更好。 但根据我的经验,使用OOP可以更好地进行代码pipe理。 你知道哪个代码是在哪里,在哪个文件中定义了哪些function,等等。关于OOP的运行时间开销,我读了一些地方(我认为这是真的),如果你在传统函数中编写了错误的代码,在OOP中,function版本效果更好。 所以如果你的代码写得不好,没有证据certificateOOP是保持你的应用程序缓慢。 还要记住,这些“慢”和“开销”的东西都是用毫秒来衡量的。 所以如果你的应用程序没有为很多用户提供服务(比如一分钟内有100多个用户),你可能没有什么区别。
OOP允许您创build代码的结构化容器,称为类,它们可以是父母/孩子之间的。 这可以帮助构build一个应用程序,因为它更容易维护,并且如果正确完成,可以减less代码冗余。 面向对象程序确实增加了一些开销,但并不是真正引起人们注意的,而且程序代码的不可维护性却被忽略了。 如果你写一个大的应用程序,def去OO,特别是如果它将被许多人的工作。
例如,假设你正在devise一个简单的网站。 你可以创build一个Page对象。 页面对象负责进入数据库并获取页面的各种设置,例如元数据,标题标签,甚至页面上某些“组件”的数量及其types(如日历控件,小部件等等)。
然后,您可以创build另一个类,比如说Index,它扩展了Page。 索引将是索引或主页。 如果您有产品目录,则可以使用Catalog类扩展页面。 由于您的目录部分和您的主页都需要从数据库中获取有关页面元数据和页面基本结构的数据,因此有1个对象已经为您提供帮助。 在这两种情况下,页面都会完成所有工作,并从数据库获取页面数据,将其加载到variables中,然后在索引类和目录类中都可以访问这些variables。 您不必编写代码进入数据库,然后在您编写的每个页面中重新获取代码。
现在还有其他方法可以在程序上做到这一点,比如使用include。 但是,你会发现自己减less错误和错误。 例如,您可以在Page类中定义一个抽象方法。 这意味着这个方法必须在扩展它的任何对象中定义。 所以说你在Page类中创build了一个setPageAttributes()函数作为抽象。 当你这样做,你创build一个空的函数。 当你创build你的索引类的时候,你必须创build一个setPageAttributes()函数(用来填充它,例如访问Page类中定义的variables,并使用它来设置页面,模板或者页面上的实际元素)查看你正在使用),否则你会得到一个PHP错误。
如果您正在与其他人合作来撰写您的项目,抽象方法会告诉这个人:“嘿,您需要在您编写的任何代码中定义这些函数”。 这迫使应用程序保持一致。
最后,如果你不做OOP,你不能去MVC格式的框架。 虽然没有必要去MVC,并且有一些争论,它将应用程序的所有组件分离出来,并且在很多人(devise者,编码人员和营销人员)使用相同的代码的环境中是必要的。
被接受的答案似乎忽略了可以根据variables名称来调用函数,如下例所示:
function drive($the_car){ $the_car(); }
无可否认,在这种情况下,每辆车都需要有一个function,但比build议的开关语句更有效率。
其他variables可以很容易地提供:
function operate($the_car,$action){ $the_car($action); } function ferrari($action){ switch($action){ case 'drive': echo 'Driving'; break; case 'stop': echo 'Stopped'; break; default: return; } } operate('ferrari','drive');
这里有一个switch语句,但是它提供了原来的例子中没有的附加function,所以它绝不是矛盾的。
PHP中使用了OOP概念,以保证代码的安全。 由于所有查询都是用函数文件而不是代码文件编写的,所以没有人可以轻易地破解我们的代码。 所以最好在PHP中使用类而不是直接编写查询。