我是怎样的一个缓慢的学习者我猜的,当涉及到编码,我一直在学习PHP的几年,我仍然不明白类,所以它的时候,我把一些精力到至少理解他们好一点。
我使用的功能应有尽有。 人们经常提出意见我就在这里,他们可以不相信我有一个社交网站,我不使用类。
我真的不明白他们的好处,你可以解释,除了它理应是easiar多的人对你的代码工作的好处是什么?
对我来说,好像刚刚类复杂简单的任务
我是怎样的一个缓慢的学习者我猜的,当涉及到编码,我一直在学习PHP的几年,我仍然不明白类,所以它的时候,我把一些精力到至少理解他们好一点。
我使用的功能应有尽有。 人们经常提出意见我就在这里,他们可以不相信我有一个社交网站,我不使用类。
我真的不明白他们的好处,你可以解释,除了它理应是easiar多的人对你的代码工作的好处是什么?
对我来说,好像刚刚类复杂简单的任务
简单地(其实非常简单),类允许你来组织逻辑单元代码以及为用户创建的对象提供容器和模板。
比方说,你有车......一辆车可以有能力和里面的人。
class Car {
private $people = array();
private $capacity;
function __construct($capacity) { $this->capacity = $capacity; }
function addPerson($name) {
if(count($this->people) >= $this->capacity) {
throw new Exception("Car is already at capacity");
} else {
$this->people[] = $name;
}
}
function getPeople() { return $this->people; }
function getCapacity() { return $this->capacity; }
}
现在,我们可以开始使用那些车:
$aliceCar = new Car(2);
$aliceCar->addPerson("Alice");
$bobCar = new Car(4);
$bobCar->addPerson("Bob");
$bobCar->addPerson("Jake");
我现在有2辆(实例),其中包含不同的数据。
echo implode(',', $aliceCar->getPeople()); // Alice
echo $aliceCar->getCapacity(); // 2
echo implode(',', $bobCar->getPeople()); // Bob,Jake
echo $bobCar->getCapacity(); // 4
我可能还需要有一辆面包车,这将对门的附加属性:
class Van extends Car {
private $num_doors;
function __construct($capacity, $num_doors) {
parent::__construct($capacity); // Call the parent constructor
$this->num_doors = $num_doors;
}
function getNumDoors() { return $this->num_doors; }
}
现在,让我们使用面包车:
$jakeVan = new Van(7, 5);
// Van is ALSO a Car
$jakeVan->addPerson("Ron"); //Jake is with Bob now, so his son is driving the Van
$jakeVan->addPerson("Valery") //Ron's girlfriend
echo implode(',', $jakeVan->getPeople()); // Ron,Valery
echo $jakeVan->getCapacity(); // 7
echo $jakeVan->getNumDoors(); // 5
现在,也许你可以看到我们如何可以应用这些概念走向创造,例如,一个DBTable
和User
类。
事实上,这是很难真正开始解释为什么类简化自己的生活没有进入面向对象编程(抽象,封装,继承,多态)的概念。
我建议你阅读下面的书籍。 这将帮助你掌握OOP的核心概念,帮助您了解为什么对象,真正使您的生活更轻松。 如果没有对这些概念的理解,可以很容易地解雇类只是另一种并发症。
PHP 5的对象,模式与实践http://ecx.images-amazon.com/images/I/51BF7MF03NL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg
可在Amazon.com
这是一个很大的话题,甚至从最SOers的最佳答案只能希望划伤表面,但我给我的两分钱。
类是基础OOP 。 他们是在一个非常基本的方式,对象的蓝图。 他们提供了许多功能,程序员,包括封装和多态。
封装,继承和多态是OOP的非常关键的环节,所以我打算把重点放在那些为我的例子。 我会写一个结构(仅功能),然后代码片段的面向对象的版本,我希望您能理解的好处。
首先,将结构化的示例
<?php
function speak( $person )
{
switch( $person['type'] )
{
case 'adult':
echo "Hello, my name is " . $person['name'];
break;
case 'child':
echo "Goo goo ga ga";
break;
default:
trigger_error( 'Unrecognized person type', E_USER_WARNING );
}
}
$adult = array(
'type' => 'adult'
, 'name' => 'John'
);
$baby = array(
'type' => 'baby'
, 'name' => 'Emma'
);
speak( $adult );
speak( $baby );
而现在,OOP范例
abstract class Person
{
protected $name;
public function __construct( $name )
{
$this->name = $name;
}
abstract public function speak();
}
class Adult extends Person
{
public function speak()
{
echo "Hello, my name is " . $this->name;
}
}
class Baby extends Person
{
public function speak()
{
echo "Goo goo ga ga";
}
}
$adult = new Adult( 'John' );
$baby = new Baby( 'Emma' );
$adult->speak();
$baby->speak();
不仅它应该是显而易见的是刚刚创建新的数据结构(对象)是更容易,更容易控制,在第一个例子要注意逻辑在说话()函数,在说话()在第二个方法。
请注意如何第一个必须明确检查类型的人,才可以采取行动? 当您添加其他操作功能,如步行(会发生什么),坐(),或任何其他你可能对你的数据? 每一个这些功能将复制的“类型”的检查,以确保他们正确执行。 这是封装的相对 。 数据和其中使用的功能/修改它们不以任何明确的方式连接。
而与OOP例子,正确的说话()方法被调用基于对象的创建。 这是在行动继承/多态性。 并注意在这个例子讲(),即对象的方法,明确地连接到它的作用在数据?
您正在步入一个大的世界,我祝你好运与你的学习。 让我知道如果您有任何问题。
也许你可以为自己做的最好的事情就是买/发现/借一本关于面向对象编程。 PHP类是基本上与其他现代语言(Java,C#等),一旦你学会了OOP你会编程的水平是完全与语言无关的,可以适用于任何面向对象的项目,PHP或理解类除此以外。
在某些方面,你是正确的。 类可以简单复杂任务,必然有很多,你可以不使用它们完成。 然而,类也让生活变得更加简单。
试想一下,你的生活中没有的功能。 你将不得不使用goto语句组合到一起的代码块。 呸。 当然,你可以做到同样的事情,但你需要更加努力才行,这将是一个困难的多,为您与他人分享您的工作。
类基团提供一个整洁的方式一起的相似的代码块。 此外,他们让你捕捉并很容易与工作状态。
一类的一个很好的定义是一个蓝图来创建对象。
类就像是一个计算器。 你可以有十个一千个不同的计算器做同样的事情,他们每个人保持自己的价值观和数据的轨道。
$cal1 = new calculator; $cal2 = new calculator; $cal1->add(5); $cal2->add(3); echo $cal1->show(); // returns 5 echo $cal2->show(); //returns 3
每一个计算器可以做同样的任务,并在相同的代码运行,但它们都包含不同的值。
如果你没有使用类,你就必须单独创建每个计算器,它分配一个变量,复制和粘贴你想同时使用每一个计算器。
function add_calc_1(); function add_calc_2(); function add_calc_3(); function subtract_calc_1(); function subtract_calc_2(); function subtract_calc_3(); function multiply_calc_1(); function multiply_calc_2(); function multiply_calc_3(); function divide_calc_1(); function divide_calc_2(); function divide_calc_3(); $total_1; $total_2; $total_3;
相反,你可以定义一个类,它是一个计算器的代码,然后只要你想,你可以创建许多不同的,每个都有自己的专柜。
class calc { public $total; function add(); function subtract(); function multiply(); function divide(); } $cal1=new calc; $cal2=new calc; $cal3=new calc;
带班,你可以这样做
class Stack {
private $theStack = array();
// push item onto the stack
public function push(item) { ... }
// get the top item from the stack
public function pop() { ... }
}
这个简单的例子有一定的好处。
我使用类为我的数据库表。
例如,我们有
身份证,名字,姓氏
对于这一点,我将使用一个类
class user{
public $Id, $name, $lastname
public function user($iId){
Id = $iId;
firstname = mysql_get('firstname');
lastname = mysql_get('lastname');
}
性能IL使用getData_functions检索数据,而不是把他们在构造函数中。 注意:以上只是一个大的想法,而不是例如如何构建类
但后来,你可以为多个用户做到这一点
while(mysql_get('Id')){
$user = new user('Id');
$print $user->firstname . " " . $user->lastname;
}
他们使生活更轻松。
但我会更重要的是使生活更轻松dosent意味着它的速度更快。因为一个设计糟糕的类可以慢下来。
然而,对于这样的功能是通用的,以我的全球性方案我不使用类他们。
作为一个诙谐的轶事,我曾经这样描述PHP脚本无类像肥皂剧 - 平坦,很难在现实生活中的重用。 在另一方面,面向对象的PHP更有点像真正的戏剧; 对象是动态的,并且可以多方位,虽然有趋向于自己的实例之间的差异,他们往往是基于基本戏剧性的原型。
基本上我要说的是,它更容易重新利用和重复使用的面向对象的代码,这使得实现开源框架和工具更容易。 我发现在PHP脚本纯粹是极难维护和重用,并倾向于允许糟糕的安全漏洞,有很多很好的,已经存在的面向对象的工具。