mirror of
https://github.com/yiisoft/yii2.git
synced 2025-11-23 18:18:21 +08:00
Merge pull request #5538 from nikbas/fix-properties-guide
[skip ci] Fixed typos in properties guide
This commit is contained in:
@@ -10,7 +10,7 @@ $object->label = trim($label);
|
|||||||
```
|
```
|
||||||
|
|
||||||
The drawback of the above code is that you would have to call `trim()` everywhere in your code where you might set the `label`
|
The drawback of the above code is that you would have to call `trim()` everywhere in your code where you might set the `label`
|
||||||
property. If, in the future, the `label` property gets a new requirement, such as the first letter must be captialized, you would again have to modify every bit of code that assigns a value to `label`. The repetition of code leads to bugs, and is a practice you want to avoid as much as possible.
|
property. If, in the future, the `label` property gets a new requirement, such as the first letter must be capitalized, you would again have to modify every bit of code that assigns a value to `label`. The repetition of code leads to bugs, and is a practice you want to avoid as much as possible.
|
||||||
|
|
||||||
To solve this problem, Yii introduces a base class called [[yii\base\Object]] that supports defining properties
|
To solve this problem, Yii introduces a base class called [[yii\base\Object]] that supports defining properties
|
||||||
based on *getter* and *setter* class methods. If a class needs that functionality, it should extend from
|
based on *getter* and *setter* class methods. If a class needs that functionality, it should extend from
|
||||||
@@ -28,7 +28,7 @@ namespace app\components;
|
|||||||
|
|
||||||
use yii\base\Object;
|
use yii\base\Object;
|
||||||
|
|
||||||
class Foo extend Object
|
class Foo extends Object
|
||||||
{
|
{
|
||||||
private $_label;
|
private $_label;
|
||||||
|
|
||||||
@@ -44,10 +44,10 @@ class Foo extend Object
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
(To be clear, the getter and setter methods create the property `label`, which in this case internally refer to a private attributed named `_label`.)
|
(To be clear, the getter and setter methods create the property `label`, which in this case internally refers to a private attribute named `_label`.)
|
||||||
|
|
||||||
Properties defined by getters and setters can be used like class member variables. The main difference is that
|
Properties defined by getters and setters can be used like class member variables. The main difference is that
|
||||||
when such a property is being read, the corresponding getter method will be called; when the property is
|
when such property is being read, the corresponding getter method will be called; when the property is
|
||||||
being assigned a value, the corresponding setter method will be called. For example:
|
being assigned a value, the corresponding setter method will be called. For example:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
@@ -58,20 +58,20 @@ $label = $object->label;
|
|||||||
$object->label = 'abc';
|
$object->label = 'abc';
|
||||||
```
|
```
|
||||||
|
|
||||||
A property defined by a getter without a setter is *read only*. Trying to assign a value to such a property will cause
|
A property defined by a getter without a setter is *read only*. Trying to assign a value to such property will cause
|
||||||
an [[yii\base\InvalidCallException|InvalidCallException]]. Similarly, a property defined by a setter without a getter
|
an [[yii\base\InvalidCallException|InvalidCallException]]. Similarly, a property defined by a setter without a getter
|
||||||
is *write only*, and trying to read such a property will also cause an exception. It is not common to have write-only
|
is *write only*, and trying to read such property will also cause an exception. It is not common to have write-only
|
||||||
properties.
|
properties.
|
||||||
|
|
||||||
There are several special rules for, and limitations on, the properties defined via getters and setters:
|
There are several special rules for, and limitations on, the properties defined via getters and setters:
|
||||||
|
|
||||||
* The names of such properties are *case-insensitive*. For example, `$object->label` and `$object->Label` are the same.
|
* The names of such properties are *case-insensitive*. For example, `$object->label` and `$object->Label` are the same.
|
||||||
This is because method names in PHP are case-insensitive.
|
This is because method names in PHP are case-insensitive.
|
||||||
* If the name of such a property is the same as a class member variable, the latter will take precedence.
|
* If the name of such property is the same as a class member variable, the latter will take precedence.
|
||||||
For example, if the above `Foo` class has a member variable `label`, then the assignment `$object->label = 'abc'`
|
For example, if the above `Foo` class has a member variable `label`, then the assignment `$object->label = 'abc'`
|
||||||
will affect the *member variable* 'label'; that line would not call the `setLabel()` setter method.
|
will affect the *member variable* 'label'; that line would not call the `setLabel()` setter method.
|
||||||
* These properties do not support visibility. It makes no difference for the visibility of a property
|
* These properties do not support visibility. It makes no difference for the visibility of a property
|
||||||
if the defining getter or setter method is public, protected or private.
|
if the defining getter or setter method is public, protected or private.
|
||||||
* The properties can only be defined by *non-static* getters and/or setters. Static methods will not be treated in this same manner.
|
* The properties can only be defined by *non-static* getters and/or setters. Static methods will not be treated in the same manner.
|
||||||
|
|
||||||
Returning back to the problem described at the beginning of this guide, instead of calling `trim()` everywhere a `label` value is assigned, `trim()` now only needs to be invoked within the setter `setLabel()`. And if a new requirement comes that requires the label be initially capitalized, the `setLabel()` method can quickly be modified without touching any other code. The one change will universally affect every assignment to `label`.
|
Returning back to the problem described at the beginning of this guide, instead of calling `trim()` everywhere a `label` value is assigned, `trim()` now only needs to be invoked within the setter `setLabel()`. And if a new requirement comes that requires the label to be initially capitalized, the `setLabel()` method can quickly be modified without touching any other code. The one change will universally affect every assignment to `label`.
|
||||||
|
|||||||
Reference in New Issue
Block a user