标签: late-static-binding

查看父类中子类中是否存在静态属性(后期静态绑定)?

父类中的代码:

foreach(static::$_aReadOnlyDatabaseTables AS $TableName => $aColumns){
  // Do something
}
Run Code Online (Sandbox Code Playgroud)

此工程时,$ _aReadOnlyDatabaseTables在子类中的定义,但在$ _aReadOnlyDatabaseTables不存在抛出一个错误.我需要先检查这个属性是否存在.

我认为它应该是这样的:

if(property_exists(static,$_aReadOnlyDatabaseTables)){
   foreach(static::$_aReadOnlyDatabaseTables AS $TableName => $aColumns){
      // Do something
   }
}
Run Code Online (Sandbox Code Playgroud)

但这会引发语法错误unexpected ',', expecting T_PAAMAYIM_NEKUDOTAYIM.使用$this代替static也不起作用,它总是评估错误.

这个的正确语法是什么?

php late-static-binding

6
推荐指数
1
解决办法
4005
查看次数

PHP 5.2相当于后期静态绑定(新的静态)?

我试图在php 5.2服务器上创建一个为php 5.3构建的脚本.该脚本使用了许多后期静态绑定,如:

return new static($options);
Run Code Online (Sandbox Code Playgroud)

什么是在PHP 5.2中相当于这个?它会以某种方式成为新的自我吗?或者是不可能达到同样的效果......

谢谢

编辑:

这是一个相关的问题新自我与新静态

Juts试图绕过这个已经过时的静态绑定东西......

php late-static-binding

5
推荐指数
1
解决办法
1635
查看次数

static:: vs. self:: - 有什么缺点吗?

这个 StackOverflow 问题中,我了解到它self::不是继承感知的static::(在 PHP 中)。当涉及在类中定义一堆常量时,如果您想覆盖子类中的这些常量以更改默认的“行为”,则必须使用static::父类中引用该常量的方法,从而尊重“覆盖”。

自从我提出这个原始问题以来的 2 年里,我已经开始static::广泛使用,以至于我很少使用,self::因为self::这似乎限制了使用常量的类的可扩展性,而static::没有这种限制。

即使我不目前打算常数被覆盖在一个子类,我最终使用static::,以防万一-所以我没有做一堆的以后的搜索和替换,如果事实证明我将要扩展类并覆盖常量。

但是,在其他人的代码中,我很少看到static::. 直到 2012 年,我什至不知道它的存在。那么,为什么不是理所当然地使用static::代替的普遍做法self::呢?

我的问题的话,就是:是否有任何明显的缺点,使用static::了指的类的常量,而不是self::?我是否因为在这里使用了严重的反模式而感到内疚?

php static constants self late-static-binding

5
推荐指数
1
解决办法
1634
查看次数

在抽象的PHP类中返回类型“ self”

PHP 7.1

我目前正在尝试制作一个抽象类,以提供和定义并部分实现其子类的功能。

在这里,我使用以下构造:

abstract class Parent {

    public static function fromDB(string $name = '') {
        $instance = new static();
        if (!empty($name)) {
            $instance->setName($name)->read();
        }
        return $instance;
    }

    public abstract function read();

    public abstract function setName(string $name): self;

}
Run Code Online (Sandbox Code Playgroud)

在这里PHP似乎理解setName($name)返回类型为Object的Object Parent,但是PhpStorm指示read()不能在结果上调用,这将是预期的结果。

错误消息:在主题类中找不到引用的方法。

我不确定这是否是PHP或PhpStorm中的错误,或更可能是我不了解自己在做什么...

我已经阅读了“后期静态绑定”和以下部分讨论此问题的问题,但我不知道如何解决此问题:

感谢您的时间和帮助。


编辑:如下所示,我试图在子类中实现:

public function setName(string $name = null): user {...}
Run Code Online (Sandbox Code Playgroud)

这显然不适用于selfreturn,但(IMO应该)使用static,这是被禁止的。

php inheritance late-static-binding phpstorm

5
推荐指数
2
解决办法
2614
查看次数

我应该使用新的自我还是新的静态?

我从事一个专有项目,该项目使用了很多种形式的工厂.他们中的大多数不通过名称实例化类,幸运的是,但是否new self()还是new static()用于实例取决于开发商变化.

我知道不同之处,但我很好奇是否有一些共识,即当技术上不需要后期静态绑定时哪一个是"正确"的方法.例如,new static()经常在服务类中找到几乎肯定永远不会被子类化的服务类.它在抽象类中显然很重要,但我的偏好是使用new self()我不期望子类的地方.

解决技术差异的问题:

我很好奇:

  • 使用后期静态绑定是否会影响性能?
  • 采用一种做法是否会对代码维护产生影响?例如.如果我使用类子类new self(),我必须覆盖/更改所有这些情况,但如果我的构造函数更改,这可能不是一件坏事.
  • 有没有记录在案的最佳做法?我们使用PSR-2,至少是有抱负的,但我不认为它涵盖了这一点.

php late-static-binding psr-2

5
推荐指数
1
解决办法
1038
查看次数

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

我正在寻找get_called_class()相当于__FILE__......也许是类似的东西get_included_file()

我有一组类,想知道它们存在于哪个目录中.这样的东西:

<?php

class A {

    protected $baseDir;

    public function __construct() {
        $this->baseDir = dirname(__FILE__);
    }

    public function getBaseDir() {
        return $this->baseDir;
    }
}

?>
Run Code Online (Sandbox Code Playgroud)

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

<?php

class B extends A {
    // ...
}

class C extends B {
    // ...
}

$a = new A;
echo $a->getBaseDir();

$b = new B;
echo $b->getBaseDir();

$c = new C;
echo $c->getBaseDir();

// Annnd... all three return the same base directory.

?>
Run Code Online (Sandbox Code Playgroud)

现在,我可以做一些贫民窟,比如增加$this->baseDir = …

php inheritance late-static-binding php-5.3

4
推荐指数
2
解决办法
1047
查看次数

什么是PHP中的呼叫转发和静态调用或其他后期静态绑定?

我从网站上获得的一个代码示例,但我很难理解输出.我正在分享代码:

class A 
{
  public static function foo() 
  {
    static::who();
  }

  public static function who() 
  {
    echo __CLASS__."\n";
  }
}

class B extends A 
{
   public static function test() 
   {
      A::foo();
      parent::foo();
      self::foo();
   }

   public static function who() 
   {
     echo __CLASS__."\n";
   }
 }

class C extends B 
{
   public static function who() 
   {
      echo __CLASS__."\n";
   }
}

C::test();
Run Code Online (Sandbox Code Playgroud)

输出如下::

A
C
C
Run Code Online (Sandbox Code Playgroud)

如果解释上面的输出,我会得到很大的帮助.提前致谢.

php oop static function late-static-binding

4
推荐指数
1
解决办法
770
查看次数

PHP后期静态绑定无法正常工作

在PHP中编码和使用后期静态绑定时,我发现了一些奇怪的行为.static()在其父类中创建的子对象可以访问其父类的私有方法.

这是一个例子:

class Attachment
{
  public static function createFromFile($file)
  {
    $attachment = new static();
    echo get_class($attachment) . PHP_EOL;
    $attachment->loadFromFile($file);
  }

  private function loadFromFile($file)
  {
    echo 'attachment';
  }
}

class PictureAttachment extends Attachment
{
  //...
}

PictureAttachment::createFromFile('example.txt');
Run Code Online (Sandbox Code Playgroud)

输出:

PictureAttachment
attachment
Run Code Online (Sandbox Code Playgroud)

这是正确的行为吗?

php late-static-binding static-binding

3
推荐指数
1
解决办法
114
查看次数

哪位孙子打电话给我?

说我有这个课程

class Grandpa
{
    public function call(){
        // Well, I want to know who calls me here
    }
}

class Father extends Grandpa
{
}

class GrandsonOne extends Father
{
}

class GrandsonTwo extends Father
{
}
Run Code Online (Sandbox Code Playgroud)

现在,我调用Grandson类中的函数,如下所示:

GrandsonOne::call();
GrandsonTwo::call();
Run Code Online (Sandbox Code Playgroud)

我该怎么弄清谁叫谁?

php late-static-binding

3
推荐指数
1
解决办法
108
查看次数

如何使父类中的“self”引用PHP中的扩展类?

我正在使用 Wordpress,需要实例化一个类似于这个过于简化的示例的新类(对于add_action()接收一些参数的钩子):

class A {
        public function __construct() {
        }

        public static function init() {
                $instance = new self();
                $instance->doStuff();
        }

        protected function doStuff() {
                echo get_class($this);
        }
}

class B extends A {
}

B::init(); //returns 'A'
Run Code Online (Sandbox Code Playgroud)

当扩展类调用时,我如何才能self引用init()它们?我知道PHP 文档中的最新静态绑定页面,但我不清楚如何在上述上下文中应用它。谢谢!

php factory dry self late-static-binding

3
推荐指数
1
解决办法
807
查看次数

PHP Late Static Binding引用调用类

我有一个静态函数被调用,它给出了一个奇怪的错误.这是一个PHP代码的例子:

class foo {
     public $stat;
     public function __construct() {
         $this->stat = stat::isValid('two');
     }
}

class stat {
     protected static $invalidNumbers = array('one', 'two');
     function isValid($number) {
         return in_array($number, static::$invalidNumbers);
     }
}

$foo = new foo();
var_dump($foo->stat);
Run Code Online (Sandbox Code Playgroud)

此代码导致以下错误:

Fatal error: Access to undeclared static property: foo::$invalidNumbers
Run Code Online (Sandbox Code Playgroud)

但是,更改static::self::使代码按预期运行.我的印象是在这种情况下使用static::应该起作用.

为什么会出现此错误static

php late-static-binding

2
推荐指数
1
解决办法
257
查看次数

perl中的后期静态绑定

是否有任何语法用于在perl中指示"Late Static Bindings"?在PHP中,有. http://php.net/manual/en/language.oop5.late-static-bindings.php

我只是在为perl寻找它们.

php perl late-static-binding

0
推荐指数
1
解决办法
52
查看次数