问题标签 [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.

0 投票
2 回答
240 浏览

php - PHP 可以做一件相当琐碎的继承事情吗?

我有以下代码:

当我调用SpecificClass::test()时,我收到一个错误:

所以我基本上想要的只是让我们AbstractParent实例test()test()调用它的类(所以,在我的例子中,实例化SpecificClass)。

0 投票
3 回答
1868 浏览

php - 有没有办法让 PHP 子类继承属性(静态和实例)?

如果我声明一个基类如下:

然后扩展它:

然后这样做:

有没有办法让我的第二个继承自第一个的类也继承属性而不仅仅是方法?

我只是想知道是否有一些关于 PHP 的后期静态绑定以及允许这样做的继承。我已经在解决这个问题了……但是,未声明的静态属性会退回到其父级以获取值似乎没有意义!?

0 投票
3 回答
3285 浏览

php - 是否可以在 PHP 中过度使用后期静态绑定?

从 5.3 版开始,PHP 支持静态方法的后期绑定。虽然它无疑是一个有用的特性,但只有少数情况下确实需要使用它(例如 Active Record 模式)。

考虑这些例子:

1. 便利构造函数(::create()

如果这个类可以扩展(但是,它没有被同一个包中的任何类扩展),是否应该使用后期静态绑定来使其更容易扩展(不必重写::create()方法,更重要的是,不必记住要做到这一点)?

注意:此习惯用法用于解决无法在仅构造的对象上调用方法的问题:new SimpleObject()->doStuff()在 PHP 中无效。


2.类常量

static::在这个例子中使用的原因与上一个类似。之所以使用它,是因为可以通过扩展它并覆盖常量来使此类匹配不同格式的标签。


那么,总而言之,后期静态绑定的这些用途(和类似用途)是不是有点矫枉过正?是否有明显的性能影响?此外,频繁使用后期绑定是否会降低操作码缓存带来的整体性能提升?

0 投票
8 回答
46559 浏览

php - PHP 中的后期静态绑定到底是什么?

PHP 中的后期静态绑定到底是什么?

0 投票
5 回答
1167 浏览

php - 忘记后期静态绑定,我需要后期静态 __FILE__

我正在寻找get_called_class()类似的__FILE__东西......也许像get_included_file()

我有一组类想知道它们存在于哪个目录中。像这样:

在其他文件中,在其他文件夹中...

现在,我可以做一些 ghetto 的事情,比如添加$this->baseDir = dirname(__FILE__)到每个扩展类,但这似乎有点……ghetto。毕竟,我们谈论的是 PHP 5.3,对吧?这不应该是未来吗?

是否有另一种方法来获取声明类的文件的路径?

0 投票
3 回答
7006 浏览

php - 继承子类中的静态属性而不重新声明?

我现在正在编写的应用程序和这个人有同样的问题。问题是子类中没有继承静态属性,因此如果我在主类中使用 static:: 关键字,它也会在我的主类中设置变量。

如果我在子类中重新声明静态变量,它会起作用,但我希望有大量的静态属性和子类,并希望避免代码重复。我链接的页面上评分最高的响应有一个指向一些“解决方法”的链接,但它似乎有 404'd。谁能给我一些帮助,或者指出我所说的解决方法的方向?

0 投票
1 回答
419 浏览

php - get_call_class hack 不适用于 eval 代码

我正在使用ge_called_classhack 允许在 php 版本 5.2 中进行后期静态绑定(在此处找到)。

我的代码中有以下内容:

由于某种原因,这在 php 5.2 中不起作用,所以我这样做了:

另一方面,这不适用于该get_called_class功能。我收到一个错误,该file函数无法读取已评估的代码部分。

0 投票
3 回答
288 浏览

php - php < 5.3 中不可能有抽象工厂?

我正在研究一个抽象类,以节省几个类的一些代码。这些类都是通过不同的静态调用实例化自己的工厂。我可以通过将所有这些方法放在一个抽象类中来节省一些代码。

但是,我遇到了后期静态绑定问题……因为我们的网络主机没有使用 5.3 或更高版本,所以我无权访问 get_call_class。如果我有

在抽象类中,__CLASS__是抽象类的名称,当我真正希望它使用被调用的类时。

我在网络上看到过抽象工厂的例子,其中子类有自己的实例化方法,并且不依赖抽象父类。然而,在这种情况下,抽象类的唯一原因是为了节省代码,所以如果我不能在那里做,它的价值就会大大降低。

php < 5.3 中有解决方法吗?debug_backtrace()?


编辑:

我做了一个测试,它似乎debug_backtrace()不起作用!我想这就是我们需要后期静态绑定的原因。

结果:

0 投票
2 回答
1143 浏览

objective-c - Objective-C 后期静态绑定

如果你愿意的话,我正在自学Objective-C作为一种罪恶的乐趣。我自称对 Java 语言有很强的掌握,所以这不是一个非常困难的过渡——虽然它确实很有趣。但是,唉,我的问题!

我正在尝试重现 PHP 中存在的东西:Late Static Binding。在 PHP 中,我可以使用“static::”来装饰方法调用,它会在运行时将该方法动态绑定到调用者。另一方面,如果使用关键字“self::”,则绑定是静态的,并且与它所在的类相关联,而不管哪个子类调用它。

在 Obj-C 中,我很难重现这种范式。我已经问过我的霸主谷歌,如何在 Cocoa 中进行后期静态绑定,但我认为这是不可能的。它可能被称为别的东西,或者它可能需要一个非常复杂的解决方法。这就是我现在正在做的事情:

父类方法:

子类 ChildClass 扩展了 ParentClass 并且不覆盖实例方法 whoAmI。

当我将消息发送到每个类对象时,动态绑定会完成它应该做的事情,并且我从 NSLog() 中得到以下信息:

2010-09-21 11:39:07.484 WhoAmI[4803:a0f] 来自父母的电话:父母
2010-09-21 11:39:07.486 WhoAmI[4803:a0f] 来自儿童的电话:儿童

最后,如果可能的话,我想学习如何让 Cocoa 停止动态绑定,以便 whoAmI 方法总是返回它所在的对象(总是父对象)。我也希望它是一个实例方法。我该怎么做呢?

-肖恩

0 投票
1 回答
1651 浏览

php - PHP 5.3:在父类中定义而在子类中缺少属性时,后期静态绑定对属性不起作用

看一下这个例子,并注意指示的输出。

我的理解是,使用static关键字将引用子类,但显然,只要子类中缺少它,它就会神奇地应用于父类。(这对于 PHP 来说是一种危险的行为,更多内容将在下面解释。)

对于为什么要这样做,我有以下两点考虑:

  1. 我不希望在所有子类中定义所有属性的冗余。
  2. 我希望将属性定义为父类中的默认值,并且我希望子类定义能够在需要时覆盖这些属性。每当需要使用默认值时,子类都需要排除属性,这就是为什么我没有在上面的示例中定义子类中的属性。

但是,如果我们想在运行时覆盖一个属性(通过 init 方法),它将为父类覆盖它!从那时起,较早初始化的子类(如 Brother 的情况)出乎意料地改变了你。

显然,这是因为子类没有自己的静态属性副本,只要它没有在子类内部显式定义 - 但不是抛出错误,而是切换静态行为以访问父类。因此,父类是否可以通过某种方式动态创建属于子类的属性,而不会出现在子类定义中?这样子类可以拥有自己的静态属性副本,并且静态关键字可以正确引用它,并且可以编写它以考虑父属性默认值。

还是有其他解决方案,好的、坏的或丑陋的?