Commit f629faf9 by Qiang Xue

minor improvement to doc. [skip ci]

parent f34fa1ed
...@@ -14,8 +14,12 @@ The drawback of the above code is that you have to call `trim()` everywhere when ...@@ -14,8 +14,12 @@ The drawback of the above code is that you have to call `trim()` everywhere when
property. And if in future, the `label` property has a new requirement, such as the first letter must be turned property. And if in future, the `label` property has a new requirement, such as the first letter must be turned
into upper case, you would have to modify all those places - a practice you want to avoid as much as possible. into upper case, you would have to modify all those places - a practice you want to avoid as much as possible.
To solve this problem, Yii introduces the support for defining properties based on *getter* and *setter* class methods. To solve this problem, Yii introduces a base class called [[yii\base\Object]] to support defining properties
**A class must extend from [[yii\base\Object]] or its child class if it wants to get this support.** based on *getter* and *setter* class methods. If a class needs such a support, it should extend from
[[yii\base\Object]] or its child class.
> Info: Nearly every core class in the Yii framework extends from [[yii\base\Object]] or its child class.
This means whenever you see a getter or setter in a core class, you can use it like a property.
A getter method is a method whose name starts with the word `get`, while a setter method starts with `set`. A getter method is a method whose name starts with the word `get`, while a setter method starts with `set`.
The name after the `get` or `set` prefix defines the name of a property. For example, a getter `getLabel()` and/or The name after the `get` or `set` prefix defines the name of a property. For example, a getter `getLabel()` and/or
...@@ -54,19 +58,22 @@ $label = $object->label; ...@@ -54,19 +58,22 @@ $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 a 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 a property will also cause an exception. It is not common to have write-only
properties. properties.
Back to the problem we described at the beginning, the `trim()` function is now called within the setter `setLabel()`. There are several special rules or limitations of the properties defined based on getters and setters.
If a new requirement comes that the first letter of the label should be turned into upper case, we only need to
modify the `setLabel()` method without touching other code.
There are some special rules or limitations of the properties defined based on getters and setters. * The names of such properties are *case-insensitive*. For example, `$object->label` and `$object->Label` are the same.
First, the names of such properties are *case-insensitive*. This is because PHP method names are case-insensitive. This is because PHP method names are case-insensitive.
Second, the properties do not support visibility. It makes no difference for the visibility of a property * If the name of such a property is the same as a class member variable, the latter will take precedence.
if the defining getter or setter method is public, protected or private. Third, the properties can only For example, if the above `Foo` class has a member variable `label`, then the assignment `$object->label = 'abc'`
be defined by *non-static* getters and/or setters. Static methods do not count. will happen to the member variable instead of the setter `setLabel()`.
* The 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.
* The properties can only be defined by *non-static* getters and/or setters. Static methods do not count.
Back to the problem we described at the very beginning, instead of calling `trim()` everywhere, we are calling it
only within the setter `setLabel()`. And if a new requirement comes that the first letter of the label should
be turned into upper case, we just need to modify the `setLabel()` method without touching any other code.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment