繁体   English   中英

PHP OOP-我不了解属性的好处是什么?

[英]PHP OOP - I don't understand what is benefit of properties?

我一直在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);
     ?>

但我读到有一种叫做“ getter setter”的东西,在这样的属性上非常受关注

class Foo
{
    private $bar;

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

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

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

我不知道他们为什么这么担心房地产。 对我来说这没有意义。 如果要使用变量,则只需在类外部分配变量或将值放入函数参数中即可。

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

例如,具有某人姓名和年龄的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"

通过将一个人的数据集中在一个位置(对象)中,我们可以更轻松地传递这些数据。

所有这些都与封装脚本中的数据有关。 这意味着给它一个“所有者”。 这样可以防止意外覆盖或更改数据。

一个类将所有内容封装在其中。 一切都有“可见性”,因此是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类型的对象,因为它不能包含该实例的单独数据。

CarBetter类是Car模型的正确表示。 它包含您需要了解的所有有关汽车的知识。 只能通过通过其getter和setter直接访问该类来更改它们。

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

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

问题是:可以使用的数据结构和方法。

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

$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和属性使用的基础 可以在此基础上构建更多有趣的用例。 例如多态,仅使用函数和变量实际上是不实际的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM