Php继承,动态属性和新的static()构造函数

我来自.NET世界。 现在进入这些寒冷的PHP水域。

我发现一个让我有点困惑的例子。 当然,我正在尝试将OOP基础应用于此PHP代码,但它没有任何意义。

这是我正在谈论的课程。

<?php

namespace appmodels;

class User extends yiibaseObject implements yiiwebIdentityInterface
{
    public $id;
    public $username;
    public $password;
    public $authKey;

    private static $users = [
        '100' => [
            'id' => '100',
            'username' => 'admin',
            'password' => 'admin',
            'authKey' => 'test100key',
        ],
        '101' => [
            'id' => '101',
            'username' => 'demo',
            'password' => 'demo',
            'authKey' => 'test101key',
        ],
    ];

    public static function findIdentity($id)
    {
        return isset(self::$users[$id]) ? new static(self::$users[$id]) : null;
    }

    public static function findByUsername($username)
    {
        foreach (self::$users as $user) {
            if (strcasecmp($user['username'], $username) === 0) {
                return new static($user);
            }
        }
        return null;
    }

    public function getId()
    {
        return $this->id;
    }

    public function getAuthKey()
    {
        return $this->authKey;
    }

    public function validateAuthKey($authKey)
    {
        return $this->authKey === $authKey;
    }

    public function validatePassword($password)
    {
        return $this->password === $password;
    }
}

好的,对我来说很明显,在findByIdentity($ id)方法中,它所做的只是创建一个User的静态新实例。 这是第一件让我措手不及的事情。

在.net中,您无法创建静态类的实例。

现在,继续前进。 在那一行

return isset(self::$users[$id])? new static(self::$users[$id]) : null;

我感兴趣的第二件事是以下几点。

由于您在该阵列中拥有的所有内容都是键/值集合....

private static $users = [
        '100' => [
            'id' => '100',
            'username' => 'admin',
            'password' => 'admin',
            'authKey' => 'test100key',
        ],
        '101' => [
            'id' => '101',
            'username' => 'demo',
            'password' => 'demo',
            'authKey' => 'test101key',
        ],
    ];

如何确定它必须创建一个用户对象? 反射? 这导致我到下一个问题....看着它继承的类Object,在构造函数中,有一个参数是一个数组(上面数组的一个元素)。

public function __construct($config = [])
{
    if (!empty($config)) {
        Yii::configure($this, $config);
    }
    $this->init();
}

但是,这个类在它的构造函数中调用Yii :: configure($ this,$ config),并且在这种方法中,我看到它的方式,Yii将添加到$ this中(我假设的Object实例,而不是用户)属于用户的参数。

public static function configure($object, $properties)
{
    foreach ($properties as $name => $value) {
        $object->$name = $value;
    }
    return $object;
}

在我看来,它是将参数动态添加到Object中,这将由用户通过匹配参数访问。

说得通?

从我的.NET观点来看, Object中的 $ this指的是对象实例本身,而不是从它继承的用户实例(就像我的朋友所说的)。 我告诉他这违反了基本的面向对象原则,这根本不可能。

任何人都可以让我明白这一点?

谢谢。


对于任何有兴趣的人来说,这是一个很好的答案,并且有很长的解释。

http://forums.phpfreaks.com/topic/286702-php-inheritance-dynamic-properties-and-new-static-constructor/

请享用!


在PHP中没有静态类,你可以有静态方法和静态成员。 但是每个类都可以被实例化。 你可以在构造函数中抛出一个Exception。

现在...关于static关键字。 在你使用它的上下文中,它调用了后期静态绑定类的构造函数。 这里有一些代码可以帮助你。

class Something {
    public static function getInstance() {
        return new static();
    }
}

class Other extends Something {

}

当你从Other的上下文中调用getInstancegetInstance做的是调用Other类的构造函数

// this will print `Other`
echo get_class(Other::getInstance());

此外,由于您从yiibaseObject类继承,并且没有在User定义构造函数,所以调用的构造函数是yiibaseObject的构造函数


现在到你的问题的第二部分

从我的.NET观点来看,Object中的$ this指的是对象实例本身,而不是从它继承的用户实例(就像我的朋友所说的)。 我告诉他这违反了基本的面向对象原则,这根本不可能。

$这将反驳实际的对象,无论对象是从哪个类实例化而来的。 你也可以在.NET中做到这一点,尽管你需要投射你的物体。 但是为了没有强大的打字功能的PHP,对象按照原样呈现,您可以按原样使用它。

链接地址: http://www.djcxy.com/p/58051.html

上一篇: Php Inheritance, dynamic properties and new static() constructor

下一篇: Calling a PHP Static Property through an Object Scope $Object::$ClassProperty