【问题标题】:PHP Strict standards: what's wrong with this code? [duplicate]PHP 严格标准:这段代码有什么问题? [复制]
【发布时间】:2012-01-13 11:00:18
【问题描述】:

可能重复:
Why does PHP 5.2+ disallow abstract static class methods?
Why can't you call abstract functions from abstract classes in PHP?

我在 PHP 5.3.8 上运行此代码:

abstract class Geometry
{
    abstract public static function fromArray(array $array);
}

class Point extends Geometry
{
    public static function fromArray(array $point)
    {
        return new self($point[0], $point[1]);
    }
}

并收到以下错误:

严格标准:静态函数 Geometry::fromArray() 不应该是抽象的

  • 这种方法有什么问题?
  • 强制具体类实现此工厂方法的任何可行替代方法?

【问题讨论】:

  • @ajreal:return new static 没有解决问题,也不是我们想要的行为(我想返回一个新的Point,而不是一个新的Geometry
  • @ajreal:类似的问题,但我没有遇到相同的用例,我的代码不会触发该用户面临的致命错误。我的请求专门针对严格标准警告。
  • 返回没有new
  • @ajreal:return static($point[0], $point[1]) => 解析错误:语法错误,意外'(',期待 T_PAAMAYIM_NEKUDOTAYIM
  • @rdlowrey:同样的问题,但不同的目标:正如评论员所说,我们可以合理地争辩说他“应该重新设计东西,所以 getSelectSQL() 是一个抽象的 /instance/ 方法”,但我的目标是强制一个具体的类提供一个工厂方法,根据定义,它是static。所以我很乐意至少回答我的第二个问题:“任何可行的替代方案来强制具体类实现这个工厂方法?”

标签: php oop abstract-class php-5.3 factory-method


【解决方案1】:

您能否将 Geometry 设为接口,并让 Point 实现它?

【讨论】:

  • 我的目标是实现OpenGIS model,并且我在Geometry 类中确实有一些常见的行为,因此我必须引入一个接口来消除严格标准错误:class Geometry implements IGeometry (即使我们忽略警告代码运行良好)。也就是说,我认为您的解决方案是我剩下的唯一解决方案!
  • 很高兴为您工作。我不是这样的专家,无法确定这是一种故意的行为 - 是否值得在 5.4 上尝试看看是否会产生相同的警告结果?
  • 非常确实很有趣,我刚刚尝试了最新版本的 PHP (5.4.0RC3-dev),并且没有为这段代码引发 E_STRICT 错误!他们又转了 180° 吗?
  • 如果上面的票没有涵盖,建议你再筹一个。并且您的应用程序需要 PHP 5.4+ ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 2018-09-09
相关资源
最近更新 更多