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
的上下文中调用getInstance
, getInstance
做的是调用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