我已经写了大约六年的PHP了,并且我已经到了一点,我觉得我应该做更多的事情来编写更好的代码.我知道面向对象的代码是要走的路,但我无法理解这个概念.
任何人都可以解释任何白痴都可以理解,OO以及它如何在PHP中工作或指向我的白痴指导教程?
小智 34
想想一件事.任何东西,你想要做的东西.说,早餐.
(所有代码都是伪代码,任何与生活,死亡或在银行业临床滥用的语言相似都完全是巧合,与您的帖子被标记为PHP无关)
因此,您可以定义一个模板,了解您如何代表早餐.这是一个类:
class Breakfast {
}
Run Code Online (Sandbox Code Playgroud)
早餐包含属性.在普通的非面向对象的东西中,你可以使用一个数组:
$breakfast = array(
'toast_slices' => 2,
'eggs' => 2,
'egg_type' => 'fried',
'beans' => 'Hell yeah',
'bacon_rashers' => 3
);
Run Code Online (Sandbox Code Playgroud)
而且你有各种各样的功能可以摆弄它:
function does_user_want_beans($breakfast){
if (isset($breakfast['beans']) && $breakfast['beans'] != 'Hell no'){
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
你有一个烂摊子,而不仅仅是因为豆子.你有一个程序员可以随意搞砸的数据结构,这是一个不断扩展的函数集合,与完全脱离数据定义的早餐有关.所以相反,你可以这样做:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后操纵程序的早餐想法变得更加清洁:
$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();
}
Run Code Online (Sandbox Code Playgroud)
我认为这看起来更干净,并且是一种更简洁的方式来表示我们想要作为一致对象处理的数据blob.
有更好的解释OO实际上是什么,为什么它在学术上更好,但这是我的实际原因,它包含培根.
使用面向对象的一些关键原因是以类似于人类如何感知和关联事物的方式构建代码,并利用经济性,可维护性,可靠性和可伸缩性的好处.
即:几千年前人类设计了轮子.我们可能会一直在改进它,但我们当然不需要再次重新发明它......
1)我们喜欢对事物进行分类:"这个比这个更重要","这个比那个花费更多","这一个几乎和那个一样".
2)我们喜欢简化一些事情:"好吧,这是一台V8液冷式涡轮驱动拖拉机,但我仍然只是转动方向盘并用脚踩踏板来驱动它,对吧?".
3)我们喜欢标准化事物:"好吧,让我们称三角形,圆形和正方形为所有形状,并期望它们都具有区域和圆周".
4)我们喜欢适应的事情:"嗯,我喜欢这样,但我可以在赛车绿色中使用它吗?"
5)我们喜欢创建蓝图:"我还没有时间或金钱(或批准)来构建它,但它将有一个门和一个屋顶,以及一些窗户和墙壁".
6)我们喜欢保护东西:"好的,我会让你看到总价,但我隐藏了我从你那里加的标记!".
7)我们喜欢彼此沟通的事情:"我想通过以下方式访问我的银行余额:我的手机;我的电脑; ATM;银行员工等......".
为了学习如何利用OO(并看到一些优点),我建议你自己做一个练习作为家庭作业 - 也许是一个基于浏览器的应用程序,处理形状,如圆形,矩形和三角形,并跟踪它们的区域,颜色,位置和z-index等.然后添加正方形作为矩形的特殊情况,因为它与大多数的定义,区域等相同.只是具有高度与宽度相同的附加条件.为了使它更难,你可以使矩形成为一种四边形,这是一种多边形.等等
注意:在您首先熟悉OO编程的基础知识之前,我不会开始使用PHP框架.当你可以扩展你自己的类时它们会更强大,如果你不能那么它有点像死记硬背学习 - >更难!
小智 0
我一直处于你的处境,但在读了这本书后我看到了光明(几次!)http://www.apress.com/book/view/9781590599099读完这本书后,我真的“明白”了它并且我没有回头。你会在亚马逊上得到它。
我希望你能坚持、得到它并热爱它。当它聚集在一起时,它会让你微笑。
组合胜过继承。