Phpinheritance,动态属性和新的static()构造函数

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

我发现了一个让我有点困惑的例子。 当然,我试图将OOP基础应用于这个PHP代码,但它没有意义。

这是我正在谈论的课程。

 [ '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', ], ]; 

php如何确定它必须创建一个User对象? reflection? 这引出了我的下一个问题….在构造函数中查看它inheritance的类Object ,在一个参数中是一个数组(上面数组的一个元素)。

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

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

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

在我看来,它喜欢动态地向Object添加参数,User将通过匹配的参数访问它。

说得通?

从我的.net观点来看, Object中的 $ this指的是Object实例本身,而不是inheritance自它的User实例(就像我的朋友所说)。 我告诉他,这违反了基本的OOP原则,这根本不可能。

有谁能让我理解这个?

谢谢。

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

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()); 

此外,由于您inheritance自yii\base\Object类,并且您没有在User定义构造函数,因此调用的构造函数是yii\base\Object的构造函数yii\base\Object


现在到你问题的第二部分

从我的.net观点来看,Object中的$ this指的是Object实例本身,而不是inheritance自它的User实例(就像我的朋友所说)。 我告诉他,这违反了基本的OOP原则,这根本不可能。

$ this引用实际对象,无论对象实例化的类是什么。 您也可以在.NET中执行此操作,但您需要转换对象。 但是为了没有强类型的PHP,对象呈现为原样,你可以按原样使用它。