簡體   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