父类中的代码:
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 5.2服务器上创建一个为php 5.3构建的脚本.该脚本使用了许多后期静态绑定,如:
return new static($options);
Run Code Online (Sandbox Code Playgroud)
什么是在PHP 5.2中相当于这个?它会以某种方式成为新的自我吗?或者是不可能达到同样的效果......
谢谢
编辑:
这是一个相关的问题新自我与新静态
Juts试图绕过这个已经过时的静态绑定东西......
在这个 StackOverflow 问题中,我了解到它self::不是继承感知的static::(在 PHP 中)。当涉及在类中定义一堆常量时,如果您想覆盖子类中的这些常量以更改默认的“行为”,则必须使用static::父类中引用该常量的方法,从而尊重“覆盖”。
自从我提出这个原始问题以来的 2 年里,我已经开始static::广泛使用,以至于我很少使用,self::因为self::这似乎限制了使用常量的类的可扩展性,而static::没有这种限制。
即使我不目前打算常数被覆盖在一个子类,我最终使用static::,以防万一-所以我没有做一堆的以后的搜索和替换,如果事实证明我将要扩展类并覆盖常量。
但是,在其他人的代码中,我很少看到static::. 直到 2012 年,我什至不知道它的存在。那么,为什么不是理所当然地使用static::代替的普遍做法self::呢?
我的问题的话,就是:是否有任何明显的缺点,使用static::了指的类的常量,而不是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,这是被禁止的。
我从事一个专有项目,该项目使用了很多种形式的工厂.他们中的大多数不通过名称实例化类,幸运的是,但是否new self()还是new static()用于实例取决于开发商变化.
我知道不同之处,但我很好奇是否有一些共识,即当技术上不需要后期静态绑定时哪一个是"正确"的方法.例如,new static()经常在服务类中找到几乎肯定永远不会被子类化的服务类.它在抽象类中显然很重要,但我的偏好是使用new self()我不期望子类的地方.
解决技术差异的问题:
我很好奇:
new self(),我必须覆盖/更改所有这些情况,但如果我的构造函数更改,这可能不是一件坏事.我正在寻找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 = …
我从网站上获得的一个代码示例,但我很难理解输出.我正在分享代码:
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中编码和使用后期静态绑定时,我发现了一些奇怪的行为.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)
这是正确的行为吗?
说我有这个课程
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)
我该怎么弄清谁叫谁?
我正在使用 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代码的例子:
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?
是否有任何语法用于在perl中指示"Late Static Bindings"?在PHP中,有. http://php.net/manual/en/language.oop5.late-static-bindings.php
我只是在为perl寻找它们.