我努力学习OOP。 所谓的“真实世界”的例子在书中我读书没有帮助。
像所有的例子Pet
, Car
, Human
都没有帮助我了。 我需要现实生活中的例子,像注册,用户个人资料页等。
一个例子:
$user->userName = $_POST['userName'];//save username
$user->password = $_POST['password'];//save password
$user->saveUser();//insert in database
我也看到了:
$user->user = (array) $_POST;
其中:
private $user = array();
可在数组中的所有信息。
这同一类的谎言内
$user->getUser($uid);
// which sets the $this->user array equal to mysqli_fetch_assoc() using
//the user id.
是否有任何现实世界的例子在许多不同的PHP应用程序实现OOP(注册,登录,用户帐户等)?
Answer 1:
OOP不仅是一个类的外观和操作。 这也涉及一个或多个类的实例如何一起工作。
这就是为什么你看到基于“汽车总动员”和“人”这样的例子很多,因为他们实际上做说明这一原则的一个很好的工作。
在我看来,在面向对象的最重要的教训是封装和多态 。
封装:偶联数据和作用于那个数据一起以简明,合乎逻辑的方式多态性的逻辑:看起来状和/或行为状另一个的能力为一个对象。
这方面的一个很好的现实世界的例子是像一个目录迭代器。 这个目录在哪里? 也许这是一个本地文件夹,也许是像远程FTP服务器。 谁知道!
以下是一个演示半导体封装的基本分类:
<?php
interface DirectoryIteratorInterface
{
/**
* @return \Traversable|array
*/
public function listDirs();
}
abstract class AbstractDirectoryIterator implements DirectoryIteratorInterface
{
protected $root;
public function __construct($root)
{
$this->root = $root;
}
}
class LocalDirectoryIterator extends AbstractDirectoryIterator
{
public function listDirs()
{
// logic to get the current directory nodes and return them
}
}
class FtpDirectoryIterator extends AbstractDirectoryIterator
{
public function listDirs()
{
// logic to get the current directory nodes and return them
}
}
每个类/对象是负责自己的检索目录列表的方法。 的数据(变量)被耦合到所述逻辑(类函数,即,方法)使用的数据。
但故事还没有结束 - 记得我是怎么说OOP是关于类的实例是如何一起工作,而不是任何单一类或对象?
好了,让我们做一些与此数据 - 它打印到屏幕? 当然。 怎么会呢? HTML? 纯文本? RSS? 让我们来解决这个问题。
<?php
interface DirectoryRendererInterface
{
public function render();
}
abstract class AbstractDirectoryRenderer implements DirectoryRendererInterface
{
protected $iterator;
public function __construct(DirectoryIteratorInterface $iterator)
{
$this->iterator = $iterator;
}
public function render()
{
$dirs = $this->iterator->listDirs();
foreach ($dirs as $dir) {
$this->renderDirectory($dir);
}
}
abstract protected function renderDirectory($directory);
}
class PlainTextDirectoryRenderer extends AbstractDirectoryRenderer
{
protected function renderDirectory($directory)
{
echo $directory, "\n";
}
}
class HtmlDirectoryRenderer extends AbstractDirectoryRenderer
{
protected function renderDirectory($directory)
{
echo $directory, "<br>";
}
}
好了,现在我们必须遍历和渲染目录列表一对夫妇类树木。 我们如何使用他们?
// Print a remote directory as HTML
$data = new HtmlDirectoryRenderer(
new FtpDirectoryIterator('ftp://example.com/path')
);
$data->render();
// Print a local directory a plain text
$data = new PlainTextDirectoryRenderer(
new LocalDirectoryIterator('/home/pbailey')
);
$data->render();
现在,我知道你在想什么,“但是,彼得,我不需要这些大类树要做到这一点!” 但是,如果你认为,你错过了点,就像我怀疑你已与“汽车”与“人”的例子。 不要专注于例子的细节 - 而不是试图去理解这里发生了什么。
我们已经创建了两个类树木,其中一个( *DirectoryRenderer
)使用其他( *DirectoryIterator
按照预期方式) -这通常被称为合同 。 实例*DirectoryRenderer
并不关心哪种类型的实例*DirectoryIterator
收到,也没有实例*DirectoryIterator
关于他们是如何被渲染照顾。
为什么? 因为我们设计他们的方式。 他们只需将其插入到对方和工作。 这是在行动OOP。
Answer 2:
购买一本书像“PHP和MySQL的日常应用傻瓜”。
它的老,我知道[2005],但它显示了这两个程序用户登录,论坛,购物车等概念和对象与mysqli的导向。
它帮助我学习面向对象的PHP,我研究了很多。 很值得的钱。
OOP很像分组程序的位为可重复使用的部分。 它不是很难跟你说实话它只是包装您的功能集成到类的想法。
以下面向对象的东西现实世界中的小例子:
级数据库
上课时
CLASS的WebForms
级电子邮件
CLASS帐目(下面的实施例的功能)
功能SELECTACCOUNT
功能CHECKPASSWORD
功能CHECKUSERNAME
功能的createAccount
我希望你能坚持下去,PHP 6将被重新设计,以支持面向对象比以往任何时候都多。
祝好运!
Answer 3:
虽然我知道这个问题已经已经回答了,我觉得好像我可以在这里添加值。
我不认为你应该使用PHP作为一种编程语言来学习OOP。 如果您想了解Web应用程序的OOP,你应该寻找在C#或Java。 一旦你学会OOP,那么你可以申请这方面的知识到PHP。 一本书的一个例子,我要学OOP是Big Java by Cay S. Horstmann
我为什么说这个??? 因为有数以百万计的关于如何做的东西PHP的例子,但是没有多少是如何正确的程序示例。 继此,PHP允许你采取许多快捷键,也不会与Java的喜欢接受的。 因此,如果你有一个Java编程头PHP,那么我相信你会成为一个更加强大的程序员。 OOP是不特定的语言,它是一种编程范式。
如果你必须使用PHP学习OOP,那么我会建议你采取github上的公共库看看一些真正的源代码。 您可以在packagist.org搜索。 如果他们是一个体面的公共仓库,它们将包含一个readme.md文件,该文件会告诉你如何使用作曲家包。 例如https://github.com/moltin/laravel-cart是购物车软件包,你就可以在你的应用程序中使用的一个例子。 请注意,你怎么不需要看包的源代码,以了解包做。 该包已被写入了,你不关心他们的工作,但你使用它们,所以你只需要知道如何使用它们。 这正是OOP左右。
我不在乎购物车类是如何将一个项目添加了车,我只是想创建一个新的购物车,并添加什么东西。
但是什么你正在做的是深入到源代码作为一种工具来理解OOP是如何工作的。
另外此,可能更重要的是,Web应用开发,我会研究MVC设计模式。
MVC设计模式的代表模型,视图,控制器。 凡在Web应用程序的情况下,模型是负责数据库建模,视图是负责显示内容给用户。 控制器负责与模型交互和处理用户输入。
那么我想你应该尝试安装Laravel框架在本地计算机上或其他“体面的现代框架”。 为什么我说现代,因为现代的框架需要5.3+这意味着你的机器上的PHP将支持类似于你会从Java的喜欢得到真正的OOP一个minumum PHP版本。
有很多教程将告诉你如何在laravel构建Web应用程序。 随即,你会看到,当你创建一个控制器,扩展BaseController。 当你创建一个模型,您扩展侃侃而谈。 这意味着你将已经在你的代码中使用多态。 你会看到,用类,它们都被封装,并且你会看到,每个类都有一个特定的角色。
当您希望与数据库交互,您将首先创建一个new Model
的控制器方法中的对象。 当你开始了解更多,你将开始学习如何依赖注入控制器,然后学习如何甩掉你的模型,并建立信息库和程序,而不是接口。
学习Laravel初学者一个体面的书会被https://leanpub.com/codebright由戴尔·里斯。 我在Laravel聚会满足戴尔大约2个星期前。
继此,当你变得更加熟练构建Web应用程序,你会开始学习如何遵循以下原则,以你的编程:
- 单一职责原则
- 开闭原则
- 里氏替换原则
- 接口Segragation原理
- 依赖倒置原则
Answer 4:
作为astropanic说,你可以看看在一个良好的PHP框架或库的源代码。 我建议Zend框架 ,这是非常模块化的,有一个伟大的,专业的设计。 我会说这是一个非常好的一块面向对象的PHP代码。
不过,我认为这不是那么容易从一块巨大的生产代码来学习,因为它并没有真的让教你任何东西。 但如果你想真实世界的面向对象的PHP代码,Zend框架(或Symfony的,也许CakePHP的)可能是要走的路。
Answer 5:
我建议你在这一刻远离任何框架了,如果你不知道OOP,挖掘到Zend或任何其他的框架将太多。
PHP OOP是退出好笑......像哈哈有趣,因为它的支持,但PHP是不是如Java或C#中的OOP语言。
简短的例子只是为了强调我的发言:
// define class
class User {
// define properties and methods
public $name = "";
}
// instantiate class
$user = new User; // or new User() or new user, it's all the same
echo $user->name;
但如果你想“飞”做OOP你可以做到以下几点:
$user = (object) array('name' => 'Peter');
然后
$user->name;
但你可以使用OOP,就像您在Java或C#,但不相同的扩展 - 与心目中,流行的系统,例如WordPress和Drupal不是纯粹的OOP! 但你可以做的继承和其他分级面向对象的东西在PHP中也是如此。
Answer 6:
我没有在PHP OOP走多远,但我越进入它变得更容易。 这些对象的例子就在那里让你了解OOP是如何工作的。 我的理解和之前通过这个过,OOP是只是属性和方法(正常的变量和函数)。 我在真正面向对象程序性自己从我的教程应用实例,并不一定必须要在现实世界中。 这就像被勺子喂,你永远也无法理解OOP和会很容易忘记。 我的建议是学会理解。 如果你明白了,你可以做任何事情,并会实现OOP的力量。 我下载了这本书,我想你也应该这么做。 但是,这就像一个人构建的应用程序为你...
这里的链接书PHP和MySQL的日常应用傻瓜
Answer 7:
我建议也看看我的包装Arrayzy 。 这是一个在面向对象的方式是原始的PHP阵列容易操作库。
所以,如果你有本地的PHP阵列职能的工作 - 你可以做同样的事情在OOP和Arrayzy帮助你用它,例如:
// Functional programming:
$array = ['a', 'b', 'c'];
$resultArray = array_merge($array, ['c', 'd']);
和
// Object-oriented programming:
$obj = Arrayzy\MutableArray::create(['a', 'b', 'c']);
$obj->mergeWith(['c', 'd']);
$resultArray = $obj->toArray();
在这两种情况下,结果阵列将是:
Array(
0 => 'a'
1 => 'b'
2 => 'c'
3 => 'c'
4 => 'd'
)
检查请问这是怎么mergeWith方法(或其他方式)的引擎盖下工作。
我觉得这是一个很好的例子表明,几乎所有的功能代码,你可以用面向对象的代码替换像这个库。 但随着OOP你得到更多 ,你也可以查看函数式编程VS OOP的问题,以了解更多详细信息,什么是缺点和它的道具。
文章来源: PHP: Real world OOP example