PHP OOP - 我不明白什么是物业的好处?

时间:2017-04-13 07:49:46

标签: php oop

我在OOP中经常使用的是方法。我从不使用这个房产,因为我不知道他们的利益是什么。

这是一个例子。没有必要的财产。

<?php 

    class Foo 
    {
         // don't have to use property   public $price;  public $qty;

        public function my_income($qty, $price)
        {

            return ($qty * $price);

        }

    }

    $foo = new Foo();

    echo $foo->my_income(20, 40);
     ?>

但我读过有些东西被称为“吸气剂定型器”。这对于像这样的属性非常关注

class Foo
{
    private $bar;

    public function getBar()
    {
        return $this->bar;
    }

    public function setBar($bar)
    {
        $this->bar = $bar;
    }
}

$foo = new Foo();
$foo->setBar(1);

我不知道为什么他们如此担心房产。它对我没有意义。 如果你想使用变量,你只需在类之外分配变量或在函数参数中放置值。

3 个答案:

答案 0 :(得分:4)

没有理由在该特定示例中使用属性,但对象属性非常有用。

例如,Person课程,其中包含某人的姓名和年龄:

class Person {

    private $name;
    private $age;

    public function __construct($name, $age) {
        $this->name = $name;
        $this->age = $age;
    }

    public function about() {
        return $this->name . " is " . $this->age . " years old";
    }
}

$joe = new Person("Joe", 42);
$alice = new Person("Alice", 27);
echo $joe->about(); // "Joe is 42 years old"
echo $alice->about(); // "Alice is 27 years old"

通过在一个地方(对象)将人的数据分组在一起,我们可以更轻松地传递数据。

答案 1 :(得分:1)

所有关于脚本周围数据的encapsulating。这意味着给它一个'所有者'。这可以防止数据被意外覆盖或更改。

一个类封装了其中的所有内容。所有内容都具有“可见性”,因此privateprotectedpublic

考虑这个例子:

class Car {
        // no properties but some other methods you might want.
     public function someUtitity($x, $y) {
           return $x + $y;
     }
}



class CarBetter {
    private $colour;

    private $engineSize;

    public function __construct($colour, $engineSize) {
        $this->colour = $colour;
        $this->engineSize = $engineSize;
    }

    public function getColour() {
        return $this->colour;
    }

    public function getEngineSize() {
        return $this->engineSize;
    }

    public function setColour($colour) {
        $this->colour = $colour;
    }

    public function setEngineSize($es) {
        $this->engineSize = $es;
    }

}

Car只是一个实用程序类,它实际上不能表示Car类型的对象,因为它不能包含该实例的单个数据。

CarBetterCar模型的正确表示。它包含了您需要了解的有关汽车的所有信息。只能通过getter和setter直接访问类来更改它们。

现在,当我想在我的脚本中传递这个Car实例时,我很容易确保其所有相关数据都封装在其中。 (如果它更容易,请考虑使用太空人的太空舱。)

现在,我可以拥有一个对象CarBetter的多个实例,每个实例都有自己的特定数据。除非直接通过类方法访问,否则不能更改任何数据。

答案 2 :(得分:1)

问题:可以处理它们的数据结构和方法。

在您的情况下,您有两个似乎属于一起的值,数量和价格。你可以随时将它们放在两个独立的变量中:

$qty = 20;
$price = 40;

然后使用该数据的所有函数都接受两个参数:

function income($qty, $price) { ... }

需要两个以上字段的数据结构怎么样,比如产品描述;你打算把所有这些作为个体变量吗?

$product_name = 'Foo';
$product_price = 400;
$product_description = 'Lorem ipsum';
...

产品通常有数十种属性;你会为每个变量保留一个变量,并让每个函数接受几十个参数吗?

function display_product($product_name, $product_price, $product_description, ...) { ... }

这非常不切实际。

因此,您可以定义一个可以在一个变量中携带的实际数据结构:

$product = [
    'name' => 'Foo',
    'price' => 400,
    ...
];

现在,每个使用产品数据的函数只需要接受一个包含所有数据的参数:

function tax(array $product) {
    return $product['price'] * 0.08;
}

但是你仍然有不同的数据定义;这里定义了你的$product数组结构,但是那里可能会定义任意数量的函数,如果你改变了一个或另一个,它们可能会停止正确地协同工作。所以,让它们捆绑成一件事!

class Product {
    public $name;
    public $price;
    public $description;
    ...

    public function tax() {
        return $this->price * 0.08;
    }
}

tax方法适用于特定的产品数据,并且与其正在处理的实际数据捆绑在一起,因此这两个部分几乎没有分歧的可能性。

OOP的基础以及属性的使用。可以在此基础上构建更有趣的用例;例如多态性,仅使用函数和变量并不实际。