search
HomeBackend DevelopmentPHP TutorialIn-depth learning of Yii2--yiibaseObject class, yii2--yii_PHP tutorial

In-depth learning of Yii2--yiibaseObject class, yii2--yii

We said before that most classes in Yii2 inherit from yiibaseObject, let us take a look at this today kind.

Object is a basic class that implements the function of attributes. Its basic content is as follows:

<?<span>php
namespace yii\base;

</span><span>use</span><span> Yii;

</span><span>/*</span><span>*
 * Object 是一个基础类,实现了属性的功能
 * Yii最基础的类,大多数类都继承了该类
 </span><span>*/</span>
<span>class</span> <span>Object</span> <span>implements</span><span> Configurable
{
    </span><span>/*</span><span>*
     * 获取静态方法调用的类名。返回类的名称,如果不是在类中调用则返回 FALSE。
     </span><span>*/</span>
    <span>public</span> <span>static</span> <span>function</span><span> className()
    {
        </span>...<span>
    }

    </span><span>/*</span><span>*
     * Constructor.
     </span><span>*/</span>
    <span>public</span> <span>function</span> __construct(<span>$config</span> =<span> [])
    {
        </span>...<span>
    }

    </span><span>/*</span><span>*
     * 初始化对象
     </span><span>*/</span>
    <span>public</span> <span>function</span><span> init()
    {
    }

    </span><span>/*</span><span>*
     * 魔术方法,实现 getter
     </span><span>*/</span>
    <span>public</span> <span>function</span> __get(<span>$name</span><span>)
    {
        </span>...<span>
    }

    </span><span>/*</span><span>*
     * 魔术方法,实现 setter
     </span><span>*/</span>
    <span>public</span> <span>function</span> __set(<span>$name</span>, <span>$value</span><span>)
    {
        </span>...<span>
    }

    </span><span>/*</span><span>*
     * 魔术方法,实现 isset,基于 getter 实现,有 getter 方法的属性才算存在
     </span><span>*/</span>
    <span>public</span> <span>function</span> __isset(<span>$name</span><span>)
    {
        </span>...<span>
    }

    </span><span>/*</span><span>*
     * 魔术方法,实现 unset,基于 setter 实现,有 setter 方法的属性才能 unset 掉
     </span><span>*/</span>
    <span>public</span> <span>function</span> __unset(<span>$name</span><span>)
    {
        </span>...<span>
    }

    </span><span>/*</span><span>*
     * Calls the named method which is not a class method.
     </span><span>*/</span>
    <span>public</span> <span>function</span> __call(<span>$name</span>, <span>$params</span><span>)
    {
        </span>...<span>
    }

    </span><span>/*</span><span>*
     * 检查对象或类是否具有 $name 属性,如果 $checkVars 为 true,则不局限于是否有 getter/setter
     </span><span>*/</span>
    <span>public</span> <span>function</span> hasProperty(<span>$name</span>, <span>$checkVars</span> = <span>true</span><span>)
    {
        </span>...<span>
    }

    </span><span>/*</span><span>*
     * 检查对象或类是否能够获取 $name 属性,如果 $checkVars 为 true,则不局限于是否有 getter
     </span><span>*/</span>
    <span>public</span> <span>function</span> canGetProperty(<span>$name</span>, <span>$checkVars</span> = <span>true</span><span>)
    {
        </span>...<span>
    }

    </span><span>/*</span><span>*
     * 检查对象或类是否能够设置 $name 属性,如果 $checkVars 为 true,则不局限于是否有 setter
     </span><span>*/</span>
    <span>public</span> <span>function</span> canSetProperty(<span>$name</span>, <span>$checkVars</span> = <span>true</span><span>)
    {
        </span>...<span>
    }

    </span><span>/*</span><span>*
     * 检查对象或类是否具有 $name 方法
     </span><span>*/</span>
    <span>public</span> <span>function</span> hasMethod(<span>$name</span><span>)
    {
        </span>...<span>
    }
}</span>

If you want to see detailed annotations, you can visit https://github.com/ReadCode/yii2-2.0.3-annotated/blob/master/framework/base/Object.php

From the above content, we can see that the Object class overrides the __get and __set methods. Let’s take a closer look at these two methods:

    <span>/*</span><span>*
     * Returns the value of an object property.
     *
     * Do not call this method directly as it is a PHP magic method that
     * will be implicitly called when executing `$value = $object->property;`.
     *
     * 魔术方法,实现 getter
     *
     * @param string $name the property name
     * @return mixed the property value
     * @throws UnknownPropertyException if the property is not defined
     * @throws InvalidCallException if the property is write-only
     * @see __set()
     </span><span>*/</span>
    <span>public</span> <span>function</span> __get(<span>$name</span><span>)
    {
        </span><span>$getter</span> = 'get' . <span>$name</span><span>;
        </span><span>if</span> (<span>method_exists</span>(<span>$this</span>, <span>$getter</span><span>)) {
            </span><span>//</span><span> 对象存在 $getter 方法,就直接调用</span>
            <span>return</span> <span>$this</span>-><span>$getter</span><span>();
        } </span><span>elseif</span> (<span>method_exists</span>(<span>$this</span>, 'set' . <span>$name</span><span>)) {
            </span><span>//</span><span> 如果存在 'set' . $name 方法,就认为该属性是只写的</span>
            <span>throw</span> <span>new</span> InvalidCallException('Getting write-only property: ' . <span>get_class</span>(<span>$this</span>) . '::' . <span>$name</span><span>);
        } </span><span>else</span><span> {
            </span><span>//</span><span> 否则认为该属性不存在</span>
            <span>throw</span> <span>new</span> UnknownPropertyException('Getting unknown property: ' . <span>get_class</span>(<span>$this</span>) . '::' . <span>$name</span><span>);
        }
    }

    </span><span>/*</span><span>*
     * Sets value of an object property.
     *
     * Do not call this method directly as it is a PHP magic method that
     * will be implicitly called when executing `$object->property = $value;`.
     *
     * 魔术方法,实现 setter
     *
     * @param string $name the property name or the event name
     * @param mixed $value the property value
     * @throws UnknownPropertyException if the property is not defined
     * @throws InvalidCallException if the property is read-only
     * @see __get()
     </span><span>*/</span>
    <span>public</span> <span>function</span> __set(<span>$name</span>, <span>$value</span><span>)
    {
        </span><span>$setter</span> = 'set' . <span>$name</span><span>;
        </span><span>if</span> (<span>method_exists</span>(<span>$this</span>, <span>$setter</span><span>)) {
            </span><span>//</span><span> 对象存在 $setter 方法,就直接调用</span>
            <span>$this</span>-><span>$setter</span>(<span>$value</span><span>);
        } </span><span>elseif</span> (<span>method_exists</span>(<span>$this</span>, 'get' . <span>$name</span><span>)) {
            </span><span>//</span><span> 如果存在 'get' . $name 方法,就认为该属性是只读的</span>
            <span>throw</span> <span>new</span> InvalidCallException('Setting read-only property: ' . <span>get_class</span>(<span>$this</span>) . '::' . <span>$name</span><span>);
        } </span><span>else</span><span> {
            </span><span>//</span><span> 否则认为该属性不存在</span>
            <span>throw</span> <span>new</span> UnknownPropertyException('Setting unknown property: ' . <span>get_class</span>(<span>$this</span>) . '::' . <span>$name</span><span>);
        }
    }</span>

Based on the above code, we can see that if you access a certain property of an Object object, Yii will call a function named get property name() . For example, SomeObject->Foo will automatically call SomeObject->getFoo(). If a property is modified, the corresponding setter function will be called. For example, SomeObject->Foo = $someValue will automatically call SomeObject->setFoo( $someValue) .

Take SomeObject's Foo as an example. If only the getFoo() method exists, then it is read-only. If only the setFoo() method exists, then it is write-only. Only when both methods exist Both readable and writable.

One thing to note is that only when reading and writing a non-existent member variable of an object, __get() __set() will be called automatically. If Foo is a public property, it will not go through the __get() and __set() methods.

So usually attributes are private, for example:

<span>class</span> User <span>extends</span> yii\base\<span>Object</span><span>
{
    </span><span>private</span> <span>$_name</span><span>;

    </span><span>public</span> <span>function</span><span> getName()
    {
        </span><span>return</span> <span>$this</span>-><span>_name;
    }

    </span><span>public</span> <span>function</span> setName(<span>$name</span><span>)
    {
        </span><span>$this</span>->_name = <span>trim</span>(<span>$name</span><span>);
    }
}</span>

We can also do some special processing in the get and set methods.

In addition to __get() __set(), yiibaseObject The following methods are also provided to facilitate the use of attributes:

  • __isset() is used to test whether the attribute value is not null , in isset($ object->property) is automatically called. Note that this property must have a corresponding getter.
  • __unset() is used to set the attribute value to null in unset($object ->property) is automatically called. Note that this property must have a corresponding setter.
  • hasProperty() is used to test whether there is a certain property. That is, a getter or setter is defined. If the parameters of hasProperty() $checkVars = true (default is true ), then as long as the member variable with the same name is also considered to have this attribute, as mentioned earlier public $title .
  • canGetProperty() Tests whether a property is readable. The meaning of the parameter $checkVars is the same as above. As long as the getter is defined, the property is readable. At the same time, if $checkVars is true . Then as long as the class defines member variables, whether they are public, private or protected, they are considered readable.
  • canSetProperty() tests whether a property is writable. The parameter $checkVars has the same meaning as above. As long as the setter is defined, the property can be written. At the same time, in $checkVars is ture . Then as long as the class defines member variables, whether they are public, private or protected, they are considered writable.

Students who are interested in the Yii2 source code can pay attention to the project yii2-2.0.3-annotated. A lot of comments about the Yii2 source code have been added to it, and they will continue to be added in the future~

Interested students can also participate and submit comments on the Yii2 source code.

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/1068253.htmlTechArticleIn-depth learning of Yii2--yiibaseObject class, yii2--yii Before we said that most classes in Yii2 inherit Since yiibaseObject, let us take a look at this class today. Object is a base...
Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
PHP's Purpose: Building Dynamic WebsitesPHP's Purpose: Building Dynamic WebsitesApr 15, 2025 am 12:18 AM

PHP is used to build dynamic websites, and its core functions include: 1. Generate dynamic content and generate web pages in real time by connecting with the database; 2. Process user interaction and form submissions, verify inputs and respond to operations; 3. Manage sessions and user authentication to provide a personalized experience; 4. Optimize performance and follow best practices to improve website efficiency and security.

PHP: Handling Databases and Server-Side LogicPHP: Handling Databases and Server-Side LogicApr 15, 2025 am 12:15 AM

PHP uses MySQLi and PDO extensions to interact in database operations and server-side logic processing, and processes server-side logic through functions such as session management. 1) Use MySQLi or PDO to connect to the database and execute SQL queries. 2) Handle HTTP requests and user status through session management and other functions. 3) Use transactions to ensure the atomicity of database operations. 4) Prevent SQL injection, use exception handling and closing connections for debugging. 5) Optimize performance through indexing and cache, write highly readable code and perform error handling.

How do you prevent SQL Injection in PHP? (Prepared statements, PDO)How do you prevent SQL Injection in PHP? (Prepared statements, PDO)Apr 15, 2025 am 12:15 AM

Using preprocessing statements and PDO in PHP can effectively prevent SQL injection attacks. 1) Use PDO to connect to the database and set the error mode. 2) Create preprocessing statements through the prepare method and pass data using placeholders and execute methods. 3) Process query results and ensure the security and performance of the code.

PHP and Python: Code Examples and ComparisonPHP and Python: Code Examples and ComparisonApr 15, 2025 am 12:07 AM

PHP and Python have their own advantages and disadvantages, and the choice depends on project needs and personal preferences. 1.PHP is suitable for rapid development and maintenance of large-scale web applications. 2. Python dominates the field of data science and machine learning.

PHP in Action: Real-World Examples and ApplicationsPHP in Action: Real-World Examples and ApplicationsApr 14, 2025 am 12:19 AM

PHP is widely used in e-commerce, content management systems and API development. 1) E-commerce: used for shopping cart function and payment processing. 2) Content management system: used for dynamic content generation and user management. 3) API development: used for RESTful API development and API security. Through performance optimization and best practices, the efficiency and maintainability of PHP applications are improved.

PHP: Creating Interactive Web Content with EasePHP: Creating Interactive Web Content with EaseApr 14, 2025 am 12:15 AM

PHP makes it easy to create interactive web content. 1) Dynamically generate content by embedding HTML and display it in real time based on user input or database data. 2) Process form submission and generate dynamic output to ensure that htmlspecialchars is used to prevent XSS. 3) Use MySQL to create a user registration system, and use password_hash and preprocessing statements to enhance security. Mastering these techniques will improve the efficiency of web development.

PHP and Python: Comparing Two Popular Programming LanguagesPHP and Python: Comparing Two Popular Programming LanguagesApr 14, 2025 am 12:13 AM

PHP and Python each have their own advantages, and choose according to project requirements. 1.PHP is suitable for web development, especially for rapid development and maintenance of websites. 2. Python is suitable for data science, machine learning and artificial intelligence, with concise syntax and suitable for beginners.

The Enduring Relevance of PHP: Is It Still Alive?The Enduring Relevance of PHP: Is It Still Alive?Apr 14, 2025 am 12:12 AM

PHP is still dynamic and still occupies an important position in the field of modern programming. 1) PHP's simplicity and powerful community support make it widely used in web development; 2) Its flexibility and stability make it outstanding in handling web forms, database operations and file processing; 3) PHP is constantly evolving and optimizing, suitable for beginners and experienced developers.

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: How To Unlock Everything In MyRise
1 months agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

PhpStorm Mac version

PhpStorm Mac version

The latest (2018.2.1) professional PHP integrated development tool

SublimeText3 English version

SublimeText3 English version

Recommended: Win version, supports code prompts!

WebStorm Mac version

WebStorm Mac version

Useful JavaScript development tools

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Integrate Eclipse with SAP NetWeaver application server.

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment