无法从类中调用静态方法作为变量名?

2023-11-25

我正在使用 php 5.2.6。我有一个策略模式,并且策略有一个静态方法。在实际实现策略之一的类中,它获取要实例化的策略类的名称。但是,我想在实例化之前调用静态方法之一,如下所示:

$strNameOfStrategyClass::staticMethod();

但它给出了T_PAAMAYIM_NEKUDOTAYIM.

$> cat test.php

<?

interface strategyInterface {
        public function execute();
        public function getLog();
        public static function getFormatString();
}


class strategyA implements strategyInterface {
        public function execute() {}
        public function getLog() {}
        public static function getFormatString() {}
}

class strategyB implements strategyInterface {
        public function execute() {}
        public function getLog() {}
        public static function getFormatString() {}
}

class implementation {
        public function __construct( strategyInterface $strategy ) {
                $strFormat = $strategy::getFormatString();
        }
}

$objImplementation = & new implementation("strategyB") ;

$> php test.php

Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in /var/www/test.php on line 24

$> php -v

PHP 5.2.6-1+lenny9 with Suhosin-Patch 0.9.6.2 (cli) (built: Aug  4 2010 03:25:57)

这在 5.3 中可以工作吗?


是的。该语法是在 5.3 中引入的

要解决 call_user_func:

call_user_func(array($className, $funcName), $arg1, $arg2, $arg3);

or call_user_func_array:

call_user_func_array(array($className, $funcName), array($arg1, $arg2, $arg3));

但另一方面,你想做的事情并没有真正意义......

为什么将其作为静态函数?你的构造函数在implementation无论如何都在期待一个对象(这就是strategyInterface $strategy在寻找)。传递字符串不起作用,因为字符串不实现接口。所以我要做的就是使接口成为非静态的,然后执行以下操作:

$strategy = new StrategyB();
$implementation = new Implementation($strategy);

然后,在构造函数中:

$strFormat = $strategy->getFormatString();

或者,如果您确实仍然希望该方法是静态的,您可以这样做:

$strFormat = call_user_func(array(get_class($strategy), 'getFormatString'));

Oh, and = & new联轴是已弃用(而且无论如何也不会做你认为它会做的事情)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法从类中调用静态方法作为变量名? 的相关文章

随机推荐

  • Laravel Eloquent 嵌套查询

    我正在使用 Laravel 并陷入了困境 我有以下型号 类别 Product 类别产品 CategoryProduct保存有关哪个产品属于哪个类别的信息 一个产品可能属于多个类别 现在 当我想加载属于特定类别的所有产品时 我需要运行查询Pr
  • 根据浏览器包含不同的 JavaScript 文件?

    我只想在浏览器不是 IE 时才包含 JavaScript 文件 有什么办法可以做到这一点吗 2022 年更新 为您提供一些选择 让您的服务器查看User Agent标头并向 Internet Explorer 发送与其他浏览器不同的 HTM
  • Android 中使用 java 的方法 Swizzling

    是否可以使用java在android中进行方法调配 我想拦截一个系统方法并记录其参数 然后正常处理它 我认为该技术不能在任何环境中使用 Java 来使用 也许您可以使用 AOP 获得类似的结果 但在 Android 上你能用它做的事情看起来
  • 对未命名临时对象的引用(生命周期)

    看完之后这个答案 from ildjarn 我写了下面的例子 看起来一个未命名的临时对象和它的引用有相同的生命周期 这怎么可能 C 标准中有规定吗 哪个版本 源代码 include
  • 从网络位数转换为网络掩码的最佳方法是什么?

    例如 如果我有一个像 172 20 10 0 24 这样的网络规范 24 就是位数 将其转换为像 0xffffff00 这样的网络掩码的最佳方法是什么 假设 32 位掩码和 32 位 int int keepBits 24 actually
  • 将多个模型的回归系数打印到共享数据框

    我知道这有点初级 基本上 我想将 coef 函数中的保存数据用于模型的共享数据框架 这些模型都从更大的共享数据集中提取有限的可能变量 我有3套14个模型 每组使用 100 个变量数据集中的 15 25 个变量 每个模型混合使用约 12 个变
  • 获取 cdk-virtual-scroller 中的静态组件引用? (参考文献已回收)

    我们最近将可滚动列表转换为 CDK Virtual Scroller Angular 7 2 12 和 Angular cdk 7 3 7 简而言之 似乎VirtualScrollViewport正在回收组件实例 而不仅仅是文档建议的模板
  • 使用带槽的 Python 描述符

    我希望能够在具有插槽优化的类中使用 python 描述符 class C object slots a a MyDescriptor a def init self val self a val 我遇到的问题是如何实现描述符类 以便能够在调
  • PHP 计算字符串中所有字母的出现次数

    我想计算字符串中所有字母出现的频率 说我有 str cdcdcdcdeeeef 我可以使用 str split 和 array count values 来实现此目的 array count values str split str 想知道
  • ColdFusion 轮函数

    今天我遇到了意想不到的行为或缺乏对 ColdFusion 9 10 11 Round 函数的了解 这是我的场景 Round 28 5 gt 预期结果为 29 Round 0 285 100 gt 结果不是预期的 28Round precis
  • 如何使用图形在多行上输出字符串

    我的程序覆盖public void paint Graphics g int x int y 为了画出一些刺痛g drawString someString x 10 y 30 现在 someString 可能会很长 因此它可能无法放在一行
  • “固定”浮动是什么意思?

    我正在查看 AVX 512 中的指令集 注意到一组fixup指示 一些examples mm512 fixupimm pd mm512 mask fixupimm pd mm512 maskz fixupimm pd mm512 fixup
  • matplotlib 极坐标图刻度/轴标签位置

    我一直在寻找一种方法来可靠地定位极坐标图中的刻度和轴标签 请看下面的例子 import numpy as np import matplotlib pyplot as plt fig plt figure figsize 10 5 ax0
  • jQuery getJSON 不发送 cookie

    我在域 1 中包含 JS 形成域 2 该脚本不会加载 并且在按钮上单击对domain2的JSONP请求 getJSON http www domain2 com process callback function data if data
  • iOS:以编程方式制作屏幕截图最快、最高效的方法是什么?

    在我的 iPad 应用程序中 我想截取占据屏幕大部分的 UIView 的屏幕截图 不幸的是 子视图嵌套得相当深 因此需要很长时间才能制作屏幕截图并在之后为页面卷曲设置动画 有没有比 通常 的方法更快的方法 UIGraphicsBeginIm
  • 序列化未实现可序列化的类变量

    我有一个实现可序列化的类 该类中还有一个类对象没有实现可序列化 应该做什么来序列化类的成员 我的课是这样的 public class Employee implements Serializable private String name
  • 关闭 urllib2 连接

    我正在使用 urllib2 从 ftp 和 http 服务器加载文件 某些服务器仅支持每个 IP 一个连接 问题是 urllib2 不会立即关闭连接 查看示例程序 from urllib2 import urlopen from time
  • 当您使用 flag(Enum) 时,您的限制为 64。当您达到限制时,有什么选择?

    With enum在 net下 您可以使用的最大数字是ULong 这意味着最多有 64 个标志 当您需要超过 64 个标志时 替代方案是什么 Edit 抱歉 我忘了添加这个 仍然可以使用的替代方案按位运算至少有这些 and and or u
  • 如何从 GMSMapView 更改 myLocationButton 位置?

    有人知道如何从 GMSMapView 实例获取 myLocationButton 的实例吗 或者有办法改变默认位置 我只需要把它向上移动一些像素 根据问题跟踪器的说法问题 5864 Bug GMSMapView 填充似乎无法与 AutoLa
  • 无法从类中调用静态方法作为变量名?

    我正在使用 php 5 2 6 我有一个策略模式 并且策略有一个静态方法 在实际实现策略之一的类中 它获取要实例化的策略类的名称 但是 我想在实例化之前调用静态方法之一 如下所示 strNameOfStrategyClass staticM