我在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);
我不知道为什么他们如此担心房产。它对我没有意义。 如果你想使用变量,你只需在类之外分配变量或在函数参数中放置值。
答案 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。这意味着给它一个'所有者'。这可以防止数据被意外覆盖或更改。
一个类封装了其中的所有内容。所有内容都具有“可见性”,因此private
,protected
,public
。
考虑这个例子:
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
的多个实例,每个实例都有自己的特定数据。除非直接通过类方法访问,否则不能更改任何数据。
答案 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的基础以及属性的使用。可以在此基础上构建更有趣的用例;例如多态性,仅使用函数和变量并不实际。