问题标签 [late-static-binding]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
php - 为什么在后期静态绑定子类从父方法和当前方法获取数据
好的,标题很难理解,但我试图了解后期静态绑定,我看到了这个答案 https://stackoverflow.com/a/35577069/1640606
这显示了这两个示例之间的区别:
注意,自我::$c
后期静态绑定,注意static::$c
现在,我明白了这一点,但我不明白的是,为什么第B::getVal(); // 8
一个得到getVal
from class A
,但似乎得到了 class 中定义的值B
。
所以,`B::getVal();` 获取的是类的方法,但获取的是第二个类的值。我的问题是,这是后期静态绑定的真正预期目的吗?它有助于解决什么问题?
php - 抽象 PHP 类中的返回类型“self”
PHP 7.1
我目前正在尝试创建一个抽象类来提供、定义和部分实现其子类的功能。
在这里,我使用以下构造:
这里 PHP 似乎理解setName($name)
返回一个带有 type 的 Object Parent
,但是 PhpStorm 表示read()
不能在结果上调用,这本来是预期的结果。
错误消息:在主题类中找不到引用的方法。
我不确定这是否是 PHP 或 PhpStorm 中的错误,或者更有可能是我不明白自己在做什么......
我已经阅读了后期静态绑定和以下部分讨论这个问题的问题,但我不知道如何解决它:
感谢您的时间和帮助。
编辑:如下所示,我正在尝试在子类中实现,例如:
这显然不适用于self
return 但(IMO 应该) with static
,这是被禁止的。
php - 覆盖一些函数 cakephp(后期静态绑定)
我使用CakePHP 2.9.8 开发了一个7 年前编写并开发到现在的旧应用程序。不幸的是,第一个开发人员在 CakePHP 的库中添加了一些代码,为了迁移到 CakePHP 的第 3 版,我需要转移应用程序中的更改。
其中一个变化是App::load
位于其中,~\lib\Cake\Core\App.php
并且在使用static::_map($file, $className, $plugin);
时,我可以编写一个扩展App.php
和重写_map
函数的类。
我的问题:
可以覆盖受保护的函数或属性吗?如果不:
为什么在 CakePHP 中使用(或调用)它们
static::
,例如:static::_map($file, $className, $plugin);
但定义是protected static function _map($file, $name, $plugin = null)
如果是:在我的应用程序中,我应该在哪里定义扩展 App 的类 Foo 以及
load
我想要删除开发人员更改的功能,我应该在哪里写 Foo::load?。
我App::load
在这里也放了函数:
php - 如何在 php 7.1 中表示返回类型是当前子类型?
我有
$x
没有类型提示......我喜欢类型提示,所以我想要类型提示B
,而不是A
如何直接启用类型提示$x
?
我认为是这样的
这显然行不通
有什么可以做的吗?
php - 我应该使用新的自我还是新的静态?
我从事一个专有项目,该项目使用了相当多的一种或另一种形式的工厂。幸运的是,它们中的大多数不按名称实例化类,但是否new self()
用于new static()
实例化取决于开发人员。
我知道其中的区别,但我很好奇当后期静态绑定在技术上不是必需的时,是否有一些共识是“正确”的方式。例如,new static()
经常出现在几乎可以肯定永远不会被子类化的服务类中。这在抽象类中显然很重要,但我更喜欢new self()
在我不期望子类的地方使用。
解决技术差异的问题:
我好奇的是:
- 使用后期静态绑定是否会影响性能?
- 采用一种做法是否会对代码维护产生影响?例如。如果我使用 子类化一个类
new self()
,我必须重写/更改所有此类情况,但如果我的构造函数发生更改,这可能不是一件坏事。 - 是否有记录在案的最佳实践?我们使用 PSR-2,至少是有抱负的,但我不认为它涵盖了这一点。
php - 使用具有扩展实例值的静态父实例
我有一个主要课程
然后我使用类的扩展版本:
现在,每当我需要选择用户时,我只需使用:
这很好用,但我认为专门为 id 请求创建静态快捷方式会很好,但我在统计初始化类时遇到问题。我创建了一个方法fetch
,它应该设置 Id 并使用找到的对象返回。
但是,正如我评论的那样,self
不能在抽象中使用,所以我不得不删除它并创建一个没有table
值的新实例,因为它在父类中是空的。
任何想法如何使这项工作?
php - 在没有创建对象的情况下如何调用构造函数?为什么构造函数没有以相同的方式再次被调用?
我正在使用PHP 7.1.11
考虑下面的工作代码及其输出:
如果您仔细查看代码,您会发现这两个类的构造函数都被调用,即使没有创建任何类的对象。
即使我静态访问任何静态方法,也会调用构造函数。到目前为止,我知道构造函数只能在对象创建时调用,因为构造函数的目的是为对象属性设置初始值,并使其在创建后立即可用。
那么这怎么可能呢?以这种方式使用构造函数(即在不创建对象的情况下进行访问)有什么好处?
考虑下面的代码行:
我的问题是为什么只在第一行调用 B 类的构造函数?
第二行也应该再次调用它。
为什么它的行为如此奇怪?
php - what is the need of late static binding in php
I have a code in php,
from my understanding of late static binding what the above program will return is as follows,
and if we dont use late static binding above program will return,
because of late static binding the value of $table is substituted in runtime instead of compile time.
But doesn't inheritance give the same output?
since as per the laws of inheritance, the parent attribute is overridden by child attributes
and since $table = abc in child(class Abc), won't it be overridden on $table in parent(Class DB)?
php - php中私有方法的继承和后期静态绑定
因此,我一直在阅读有关Late Static Bindings的官方 PHP 文档,并遇到了一个令人困惑的示例:
示例的输出:
有人可以解释为什么私有方法 foo() 被复制到 B 吗?据我所知,只有公共和受保护的属性会被复制到子类。我错过了什么?
php - PHP后期绑定静态与私有__construct
我有一个抽象类,它有一个使用 PHP 的后期静态绑定的函数,如下所示:
然后,我以这种方式实现了抽象类:
我的意图是没有人可以¬Text
直接实例化,所以我将__construct
函数设为私有。但是,任何人都应该能够通过¬Text::do('Lorem Ipsum')
. 这就是为什么我在MetaComponent::do()
.
但是,我收到以下错误:
PHP Fatal error: Uncaught Error: Call to private ¬Text::__construct() from context 'MetaComponent' in /xxx/MetaComponent.php:9
有没有办法从抽象类调用构造函数,同时防止__construct
被直接调用?