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原则,这根本不可能。
有谁能让我理解这个?
谢谢。
对于任何有兴趣的人来说,这是一个很好的答案,有一个冗长的解释
请享用!
在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());
此外,由于您inheritance自yii\base\Object
类,并且您没有在User
定义构造函数,因此调用的构造函数是yii\base\Object
的构造函数yii\base\Object
现在到你问题的第二部分
从我的.net观点来看,Object中的$ this指的是Object实例本身,而不是inheritance自它的User实例(就像我的朋友所说)。 我告诉他,这违反了基本的OOP原则,这根本不可能。
$ this引用实际对象,无论对象实例化的类是什么。 您也可以在.NET中执行此操作,但您需要转换对象。 但是为了没有强类型的PHP,对象呈现为原样,你可以按原样使用它。
- 网格的最优高密度二元空间划分
- C#中的正则表达式大写替换
- 没有明确的ServicePointManager.SecurityProtocol调用,在.NET 4.7中没有协商TLS 1.2
- 从inside方法中获取方法的参数名称和值
- ‘无法加载文件或程序集’netstandard,Version = 2.0.0.0,…’。 不应加载引用程序集以执行
- 垃圾收集器是否在.NET中的异步调用期间销毁暂时未引用的对象?
- Visual Studiounit testingAssert.AreEqual失败,具有相同的预期值和实际值
- 我应该在从程序代码调用Execute之前检查ICommand的CanExecute方法吗?
- 在应用程序未聚焦时侦听密钥