我有一本书了解PHP类的严重问题。 他们似乎非常困难。 什么是他们的目的,他们如何工作的?
Answer 1:
概括地说,一类是一个对象的蓝图。 和对象概念封装相关国家和在你的应用什么责任,通常提供了一个编程接口,用以与这些交互。 这就造成了代码重用和提高可维护性。
想象一下,一个锁:
namespace MyExample;
class Lock
{
private $isLocked = false;
public function unlock()
{
$this->isLocked = false;
echo 'You unlocked the Lock';
}
public function lock()
{
$this->isLocked = true;
echo 'You locked the Lock';
}
public function isLocked()
{
return $this->isLocked;
}
}
忽略namespace
, private
和public
现在声明。
该锁类是应用程序中的所有锁的蓝图。 锁可以锁定或解锁 ,由属性表示$isLocked
。 因为它只能有这两种状态,我用一个布尔值( true
或false
)来指示适用的状态。 通过它的方法我可以锁定交互lock
和unlock
,这将相应地更改状态。 该isLocked
方法会给我锁的当前状态。 现在,当你创建一个对象,从这个蓝图(通常也被称为实例 ),它将封装独特的状态,例如
$aLock = new Lock; // Create object from the class blueprint
$aLock->unlock(); // You unlocked the Lock
$aLock->lock(); // You locked the Lock
让我们创建另一把锁,还封装它自己的状态
$anotherLock = new Lock;
$anotherLock->unlock(); // You unlocked the Lock
但由于每个对象/实例封装它自己的状态,在第一锁保持锁定
var_dump( $aLock->isLocked() ); // gives Boolean true
var_dump( $anotherLock->isLocked() ); // gives Boolean false
现在,无论是保持锁定或解锁一个锁定的整个reponsibility是锁类中encaspulated。 您没有要锁定的东西,每次来重建它,如果你想改变一个锁是如何工作的,你可以在锁定的蓝图改变这种而不是一个锁定的所有类的,例如门:
class Door
{
private $lock;
private $connectsTo;
public function __construct(Lock $lock)
{
$this->lock = $lock;
$this->connectsTo = 'bedroom';
}
public function open()
{
if($this->lock->isLocked()) {
echo 'Cannot open Door. It is locked.';
} else {
echo 'You opened the Door connecting to: ', $this->connectsTo;
}
}
}
现在,当你创建一个门对象,你可以锁定一个物体分配给它。 由于锁定对象处理的东西是否被锁定或解锁所有的责任,门不必在意这一点。 事实上,可以使用任何锁定的对象就不必在意,例如胸部
class Chest
{
private $lock;
private $loot;
public function __construct(Lock $lock)
{
$this->lock = $lock;
$this->loot = 'Tons of Pieces of Eight';
}
public function getLoot()
{
if($this->lock->isLocked()) {
echo 'Cannot get Loot. The chest is locked.';
} else {
echo 'You looted the chest and got:', $this->loot;
}
}
}
正如你所看到的,胸部的reponsibility是从一个门的不同。 胸部包含战利品,而门隔开的房间。 你可以编写的锁定或解锁状态到两个班,但有一个单独的锁类,你不必和可以重复使用的锁。
$doorLock = new Lock;
$myDoor = new Door($doorLock);
$chestLock = new Lock;
$myChest new Chest($chestLock);
胸部和门,现在有自己独特的锁。 如果锁定,可在多个地方同时在量子物理存在,就像一个神奇的锁,你可以指定同一把锁既胸部和门,如
$quantumLock = new Lock;
$myDoor = new Door($quantumLock);
$myChest new Chest($quantumLock);
当你unlock()
的$quantumLock
,既门和胸部将被解锁。
尽管我承认量子锁是一个坏榜样,它说明的对象,而不是重建国家和责任感所有的地方的分享的概念。 一个真实的例子可能是您通过使用数据库类的数据库对象。
需要注意的是上面的例子中不显示怎么去胸部的锁或门用lock()
和unlock()
方法。 在我离开这个作为一个练习,你的工作了(或其他人添加)。
还要检查什么时候使用自超过$吗? 对于类和对象以及如何与他们合作,更深入的解释
对于一些额外的资源检查
- http://en.wikipedia.org/wiki/Object-oriented_programming
- http://www.php.net/manual/en/language.oop5.php
- http://www.tuxradar.com/practicalphp
- http://www.phpro.org/tutorials/Object-Oriented-Programming-with-PHP.html
- http://articles.sitepoint.com/article/object-oriented-php
Answer 2:
我知道你要的资源,而不是一个解释,但这里的东西通过我的理解类的基本实现:
试想类作为建筑的模板。 一个基本的素描建筑应该是什么样子等。 当你要真正建立它,你改变一些东西,所以它看起来像你的客户需要(在课堂上的案例属性)。 现在,你要设计的建筑里面的东西如何去表现( 方法 )。 我要告诉它在一个简单的例子。
建筑类:
/**
* Constructs a building.
*/
class Building
{
private $name;
private $height;
public function __construct( $name, $height )
{
$this->name = $name;
$this->height = $height;
}
/**
* Returns name of building.
*
* @return string
*/
public function getName( )
{
return $this->name;
}
public function elevatorUp( )
{
// Implementation
}
public function elevatorDown( )
{
// Implementation
}
public function lockDoor( )
{
// Implementation
}
}
调用类:
// Empire State Building
$empireStateBuilding = new Building( "Empire State Building", 381 );
echo $empireStateBuilding->getName( );
$empireStateBuilding->lockDoor( );
// Burj Khalifa
$burjKhalifa = new Building( "Burj Khalifa", 828 );
echo $burjKhalifa->getName( );
$burjKhalifa->lockDoor( );
只需复制它,在你的本地主机上运行它,并尝试做一些改变。 在有任何问题,只是问我。 如果你没有找到以前的海报这个有用的,只是使用的链接,这些都是非常稳固的教程。
Answer 3:
为了提供从如果我可以取悦另一角度的视图(根据个人经验)。 你需要感到“OOP的需要”,才能真正了解什么是一回事 - 恕我直言,学习资源应该来这之后。
人们会基本上是“需要”被写相对大块写在程序式的软件时(而不是面向对象的,对不起,如果有人用术语不同意)停留在结构性困难。 届时,他/她可以尝试的代码重组为对象,以更好地组织它,自然,了解OOP的细节。 再次,这是我个人的经验,并把我带进了解比任何一本书快。
只是我的两分钱。