我已经写了大约六年的PHP了,并且我觉得我应该做更多的事情来编写更好的代码。我知道面向对象的代码是要走的路,但我无法理解这个概念。
任何人都可以解释说任何白痴都能理解,OO以及它在PHP中是如何工作的,还是指向白痴指南教程?
答案 0 :(得分:33)
想想一件事。任何东西,你想要做的东西。说,早餐。
(所有代码都是伪代码,与银行业中任何生活,死亡或临床滥用语言的任何相似之处完全是巧合,与您的帖子被标记为PHP无关)
因此,您可以定义一个模板,了解您如何代表早餐。这是一个类:
class Breakfast {
}
早餐包含属性。在普通的非面向对象的东西中,你可以使用一个数组:
$breakfast = array(
'toast_slices' => 2,
'eggs' => 2,
'egg_type' => 'fried',
'beans' => 'Hell yeah',
'bacon_rashers' => 3
);
你有各种各样的功能可以摆弄它:
function does_user_want_beans($breakfast){
if (isset($breakfast['beans']) && $breakfast['beans'] != 'Hell no'){
return true;
}
return false;
}
而且你有一团糟,而不仅仅是因为豆子。你有一个程序员可以随意搞砸的数据结构,这是一个不断扩展的函数集合,与早餐完全脱离了数据的定义。相反,你可以这样做:
class Breakfast {
var $toast_slices = 2;
var $eggs = 2;
var $egg_type = 'fried';
var $beans = 'Hell yeah';
var $bacon_rashers = 3;
function wants_beans(){
if (isset($this->beans) && $this->beans != 'Hell no'){
return true;
}
return true;
}
function moar_magic_pig($amount = 1){
$this->bacon += $amount;
}
function cook(){
breakfast_cook($this);
}
}
然后操纵程序的早餐想法变得更加清洁:
$users = fetch_list_of_users();
foreach ($users as $user){
// So this creates an instance of the Breakfast template we defined above
$breakfast = new Breakfast();
if ($user->likesBacon){
$breakfast->moar_magic_pig(4);
}
// If you find a PECL module that does this, Email me.
$breakfast->cook();
}
我认为这看起来更干净,并且是一种更简洁的方式来表示我们想要视为一致对象的数据blob。
对OO实际上是什么有更好的解释,为什么它在学术上更好,但这是我的实际原因,它包含培根。
答案 1 :(得分:7)
警告已经到位:如果不学习OO设计,您将无法学习OO编程!关键概念是定义对数据进行操作的函数以及适当的数据。然后,您可以告诉您的对象要做什么,而无需查询其内容。
当然要看一下“Tell, don't Ask”哲学,“需要知道”原则(又名“德米特法则”)也是一个非常重要的原则。
答案 2 :(得分:6)
使用 OO 的一些主要原因是以类似于我们人类如何感知和关联事物的方式构建代码,并利用经济,可维护性,可靠性和可扩展性。
即:人类几千年前设计了轮子。我们可能会一直在改进它,但我们当然不需要再次重新发明它......
1)我们喜欢分类:“这个比这个更大”,“这个比那个花费更多”,“这个几乎是与那个相同“。
2)我们喜欢简化事情:“好吧,它是V8液冷式涡轮驱动拖拉机,但我仍然只是转动方向盘并按下我的脚推动它的小贩,对吧?“。
3)我们喜欢标准化事情:“好的,让我们调用三角形,圆形和正方形的所有形状,并期望它们都具有AREA和CIRCUMFERENCE ”
4)我们喜欢适应的事情:“嗯,我喜欢这样,但我可以在赛车绿色吗?”。
5)我们想创建蓝图:“我还没有时间或金钱(或批准)来构建它,但它会有一扇门还有一个屋顶,一些窗户和墙壁。“
6)我们喜欢保护事情:“好的,我会让你看到总价,但我隐藏了我添加的标记你!”
7)我们喜欢互相沟通的事情:“我希望通过以下方式访问我的银行余额:我的手机;我的电脑;自动取款机;银行员工等等。“。
要学习如何利用OO(并看到一些优势),我建议你自己做一个练习作为家庭作业 - 也许是一个基于浏览器的应用程序,处理形状,如圆形,矩形和三角形,并跟踪它们的面积,颜色,位置和z指数等等。然后添加正方形作为矩形的特殊情况,因为它与大多数的定义,区域等相同。只是具有高度相同的附加条件作为宽度。为了使它更难,你可以使矩形成为一种四边形,这是一种多边形。等等。
注意:在您首先熟悉OO编程的基础知识之前,我不会开始使用PHP框架。当你可以扩展自己的类时,它们会更强大,如果你不能,那么它有点像死记硬背 - >更难!
答案 3 :(得分:0)
最好的建议来自:xtofl.myopenid.com ^^^^
如果你不了解模式的目的,你真的不会充分利用对象。您需要知道为什么继承,多态,接口,工厂,装饰器等通过解决特定问题确实使设计更容易。
答案 4 :(得分:0)
我认为如果你采用一个促进面向对象编程的框架,而不是从零开始学习OO。它会“强迫”你使用正确的OOP方法;您将能够从框架的编写方式中学习如何最好地完成OOP。
我推荐QCodo PHP5框架http://www.qcodo.com。它有关于如何设置的精彩视频教程,以及视频培训(http://www.qcodo.com/demos/)。
完全披露:我已经在这个框架上开发了两年,我已经为他们的代码库贡献了代码(所以我不完全公正:-))。
答案 5 :(得分:0)
学习OO的另一个指针:
大多数面向对象的教程都将重点关注继承(例如,类X扩展了类Y)。我认为这是一个坏主意。继承很有用,但它也可能导致问题。更重要的是,继承不是OO的重点。重点是抽象;隐藏实现细节,以便您可以使用简单的界面。学习如何编写好的数据抽象,并且您将处于良好的状态。不要马上为遗产留下汗水。
答案 6 :(得分:0)
我一直在你的鞋子里,但是在看完这本书之后我看到了这些灯(几次!)http://www.apress.com/book/view/9781590599099在我读完之后,我真的“得到了它”,我没有回头看。你会在亚马逊上得到它。
我希望你坚持,得到它,并且爱它。当它结合在一起时,会让你微笑。
作文胜过遗产。