你能帮助我更好地理解PHP类吗?

时间:2009-07-29 01:19:41

标签: php class

我是一个学习慢的人,我想在编码时,我已经学习PHP几年了,我仍然不理解课程,所以是时候我付出一些努力来至少理解它们了好一点。

我将功能用于一切。人们经常在这里给我发表评论说他们不相信我有一个社交网站而且我不使用课程。

我真的不明白他们的好处你能解释一下这个好处,除了它可以让多个人更容易处理你的代码吗?

对我而言,类似乎只是使简单任务复杂化

8 个答案:

答案 0 :(得分:18)

简单(实际上,非常简单),类允许您以逻辑单位组织代码,并为用户创建的对象提供容器和模板。

假设你有一辆车......一辆车可以装载车内人员。

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

现在也许您可以看到我们如何将这些概念应用于创建,例如DBTableUser类。


事实上,很难真正开始解释为什么类在不涉及面向对象编程(抽象,封装,继承,多态)的概念的情况下简化了一个人的生活。

我建议你阅读以下书籍。它将帮助您掌握OOP的核心概念,并帮助您理解为什么对象真正让您的生活更轻松。如果不理解这些概念,很容易将课程视为另一种复杂因素。

PHP 5对象,模式和实践

PHP 5 Objects, Patterns, and Practice 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

时可用

答案 1 :(得分:3)

这是一个巨大的主题,即使是最好的SOers的最佳答案也只能希望划清界限,但我会给我两分钱。

课程是OOP的基础。它们以非常基本的方式呈现对象蓝图。它们为程序员提供了许多功能,包括封装和多态。

封装,继承和多态是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();

仅仅创建新的数据结构(对象)更容易和更容易控制,不仅要注意第一个例子中speak()函数中的逻辑,还要注意第二个中的speak()方法。

请注意第一个人在行动之前必须如何明确检查人的类型?添加其他操作函数时会发生什么,例如walk(),sit()或您可能拥有的其他任何数据? 这些函数中的每个都必须复制“type”检查以确保它们正确执行。这是封装的相反。使用/修改它们的数据和功能没有任何明确的连接方式。

对于OOP示例,根据对象的创建方式调用正确的speak()方法。这是行动中的继承/多态。并注意在这个例子中,speak()是一个对象的方法,它是如何显式连接到它所作用的数据上的?

你正在踏入一个大世界,祝你学习愉快。如果您有任何问题,请告诉我。

答案 2 :(得分:2)

在某些方面,你是对的。类可以使简单任务复杂化,并且在不使用它们的情况下确实可以实现很多。但是,课程也让生活变得更轻松。

想象一下你的生活没有任何功能。您必须使用GoTo语句将代码块组合在一起。呸。当然,你可以完成同样的事情,但是你需要更加努力地工作,而且与其他人分享你的工作会更加困难。

类提供了一种将类似代码块组合在一起的简洁方法。此外,它们还可以让您轻松捕捉和处理州。

类的良好定义是创建对象的蓝图。

答案 3 :(得分:2)

您可以为自己做的最好的事情是购买/查找/借阅面向对象编程的书。 PHP类基本上与其他现代语言(Java,C#等)相同,一旦你学习了OOP,你就会理解一个完全与语言无关的编程水平的类,并且可以应用于任何OOP项目,PHP或者否则。

答案 4 :(得分:1)

通过课程,您可以执行类似

的操作
class Stack {
  private $theStack = array();

  // push item onto the stack
  public function push(item) { ... }

  // get the top item from the stack
  public function pop() { ... } 
}

这个简单的例子有一些好处。

  1. 类外部的代码无法操作用于实现堆栈的数组
  2. 全局命名空间不会受到无关变量的污染
  3. 需要使用堆栈的代码可以简单地创建类的实例(即$ myStack = new Stack())

答案 5 :(得分:1)

课程就像一个计算器。你可以有一万个不同的计算器做同样的事情,每个计算器都跟踪他们自己的价值观和数据。

$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;

答案 6 :(得分:0)

我为数据库表使用类。

例如我们有

  

Id,firstname,lastname

为此,我将使用一个类

class user{

    public $Id, $name, $lastname

    public function user($iId){

      Id = $iId;
      firstname = mysql_get('firstname');
      lastname = mysql_get('lastname');
}

for performance il使用getData_functions来检索数据而不是将它们放在构造函数中。请注意,上面只是一个主要的想法,而不是如何构建类

的示例

但稍后您可以为多个用户执行此操作

while(mysql_get('Id')){

    $user = new user('Id');
    $print $user->firstname . " " . $user->lastname;
}

他们让生活更轻松。

但更重要的是,让生活变得更轻松意味着它更快......因为设计糟糕的课程可能会减慢速度。

然而,对于我的全局程序通用的这种功能,我不会为它们使用类。

答案 7 :(得分:0)

作为一个jokey轶事,我曾经描述过没有类的PHP脚本,就像肥皂剧那样平坦,难以在现实生活中重复使用。另一方面,OO-PHP有点像真正的戏剧;对象是动态的,并且可以是多方面的,虽然它们的实例化之间往往存在差异,但它们通常基于基本的戏剧性原型。

基本上我所说的是,重新调整和重用面向对象的代码更容易,这使得实现开源框架和实用程序更加容易。我发现PHP中的纯脚本非常难以维护和重用,并且往往会导致很多安全漏洞,因为有很多好的,预先存在的面向对象的实用程序。