如果我不使用OO-PHP,我将面临哪些问题?

时间:2010-12-25 01:34:04

标签: php oop

我面对一个;我设置了相同的变量名称,这让我发疯,我必须检查所有变量名称,我必须记住它们。现在我意识到它不会是OO的问题,因为它会被隐藏(封装?)。

如果我不使用OO,我将面临哪些其他问题?

2 个答案:

答案 0 :(得分:3)

OO的要点是将属于一起的东西包装在一起。请参阅存储和输出客户数据的简单示例:

$customers = array(
    array('id' => 1, 'firstname' => 'John', 'lastname' => 'Doe', 'address' => 'Foobar Lane', …),
    array('id' => 2, 'firstname' => 'Jane', 'lastname' => 'Dough', 'address' => 'Foobar Road', …)
);

function output_customer_name($customer) {
    return $customer['firstname'] . ' ' . $customer['lastname'];
}

function output_customer_address($customer) {
    return $customer['address'] . ', ' . $customer['state'] . ', ' . $customer['country'];
}

foreach ($customers as $customer) {
    echo output_customer_name($customer);
    echo output_customer_address($customer);
}

您需要为要输出的每种类型的数据声明一个不同的函数(这只是一个简单的例子,输出可能要复杂得多)。想象一下,您不仅拥有客户,还拥有产品。现在您还拥有output_product_nameoutput_product_description个功能。但是,您的数据结构($customer数组)定义不明确。您可以随时更改它,如果您忘记更新它们会破坏所有输出功能。您可能还会意外地将$product输入到output_customer_name函数中,这会破坏所有内容。

输入OOP:

class Customer {
    protected $firstname;
    protected $lastname;
    protected $address;
    …

    public function __construct($firstname, $lastname, $address, …) {
        $this->firstname = $firstname;
        $this->lastname = $lastname;
        $this->address = $address;
        …
    }

    public function name() {
        return $this->firstname . ' ' . $this->lastname;
    }

    public function address() {
        return $this->address . ', ' . $this->state . ', ' . $this->country;
    }
}

$customers[] = new Customer('John', 'Doe', 'Foobar Lane', …);
$customers[] = new Customer('Jane', 'Dough', 'Foobar Road', …);

foreach ($customers as $customer) {
    echo $customer->name();
    echo $customer->address();
}

您的数据结构和应该在其上工作的函数被捆绑到一个对象中。您不可能将$product提供给应该输出客户的函数。您的函数名称也要短得多,并且您的命名空间不会被大量功能混乱。您不会冒着在每次将数据分配到数据结构('John'$firstname)时拼错数组键的风险。处理客户的复杂性已全部打包到对象中。与程序方式形成对比,数据结构,功能和处理两者的方式都同样复杂且容易出错。在OOP中,您的对象很复杂,但处理对象的代码非常简单,几乎不会出现任何错误。

这只是一个非常简单的例子。项目越复杂,从结构合理的对象中获得的好处就越多,而不是松散结构的函数和变量。复杂性并非在整个代码库中均匀分布,而是捆绑在对象中。由于对象“外部”的代码已被简化,因此这些对象本身可以成为更复杂代码的一部分,而整个代码库的复杂性不会随着每个新的实体(产品,客户)呈指数级增长介绍。这一切都是为了让你更难以自己拍脚,让你的代码更具可读性和更好的结构。封装,抽象等是将相关事物捆绑在一起所产生的自然副作用。它们使您能够编写更简单的代码,这反过来又使您能够编写更复杂的代码而不会爆炸。

在程序代码中编写复杂的应用程序是完全可能的。但实际上,东西会发生变化。即使您是天才并且可以预先规划应用程序的整个结构,需求也会发生变化。随着时间的推移,您需要扩展,更改和维护代码库。使用结构合理,抽象化,封装,类型检查的代码比使用个人变量和函数的Rube Goldberg机器容易得多。

答案 1 :(得分:1)

这取决于系统的类型(至少我会说)。如果您正在处理大量信息或制作应该与未来PHP项目集成的大型系统,那么面向对象编程可能是最好的方法。

很难说没有解释你将要做什么。我也相信这个问题很难给出具体的答案,所以我在这里给出的不仅仅是一个事实,而是一个事实。