PHP 中抽象特征方法不允许是静态的?
Abstract trait't method not allowed to be static in PHP?
这是我的例子:
trait FileConfig {
public static function getPathForUploads() {
$paths = static::getPaths();
//etc.
}
abstract public static function getPaths(); //doesn't work. Error: "Static function SharedDefaultConfig::getPaths() should not be abstract"
abstract public function getPaths(); //OK
public static function getPaths() {} //OK
}
Class:
class AppConfig {
use FileConfig;
public static function getPaths() {
return array(...);
}
}
通话:
AppConfig::getPathForUploads();
有必要使其静态和抽象(强制类使用FileConfig来实现getPaths)。
我想知道如何实现方法改变它的 static 属性?这是一个好的做法还是有更好的解决方案?有一天它会成为非法的吗?
谢谢
要强制 class 使用 FileConfig 来实现 getPaths,不必将抽象函数设为静态。静态意味着它属于声明它的class。使其成为受保护的静态,从特征中添加代码,然后您可以通过继承 AppConfig class 来更改行为。
您不需要将方法设为静态来强制 classes 使用它来实现该方法。您可以简单地使用 interfaces 和
trait FileUploadConfig {
public static function getPathForUploads() {
$paths = static::getPaths();
//etc.
}
}
特征保持原样。我只是拿走了界面的功能。
interface PathConfiguration {
public static function getPaths();
}
接口强制class实现功能。我把 static
留在那里以符合特征的规范。
class AppConfig implements PathConfiguration {
use FileUploadConfig;
public static function getPaths() {
return [];
}
}
这在 php 7 中已修复,因此以下代码有效:
<?php
error_reporting(-1);
trait FileConfig {
public static function getPathForUploads() {
echo static::getPaths();
}
abstract static function getPaths();
}
class AppConfig {
use FileConfig;
protected static function getPaths() {
return "hello world";
}
}
AppConfig::getPathForUploads();
http://sandbox.onlinephpfunctions.com/code/610f3140b056f3c3e8defb84e6b57ae61fbafbc9
但在编译时并没有真正检查AppConfig中的方法是否为static。只有在尝试静态调用非静态方法时才会收到警告:http://sandbox.onlinephpfunctions.com/code/1252f81af34f71e901994af2531104d70024a685
这是我的例子:
trait FileConfig {
public static function getPathForUploads() {
$paths = static::getPaths();
//etc.
}
abstract public static function getPaths(); //doesn't work. Error: "Static function SharedDefaultConfig::getPaths() should not be abstract"
abstract public function getPaths(); //OK
public static function getPaths() {} //OK
}
Class:
class AppConfig {
use FileConfig;
public static function getPaths() {
return array(...);
}
}
通话:
AppConfig::getPathForUploads();
有必要使其静态和抽象(强制类使用FileConfig来实现getPaths)。
我想知道如何实现方法改变它的 static 属性?这是一个好的做法还是有更好的解决方案?有一天它会成为非法的吗?
谢谢
要强制 class 使用 FileConfig 来实现 getPaths,不必将抽象函数设为静态。静态意味着它属于声明它的class。使其成为受保护的静态,从特征中添加代码,然后您可以通过继承 AppConfig class 来更改行为。
您不需要将方法设为静态来强制 classes 使用它来实现该方法。您可以简单地使用 interfaces 和
trait FileUploadConfig {
public static function getPathForUploads() {
$paths = static::getPaths();
//etc.
}
}
特征保持原样。我只是拿走了界面的功能。
interface PathConfiguration {
public static function getPaths();
}
接口强制class实现功能。我把 static
留在那里以符合特征的规范。
class AppConfig implements PathConfiguration {
use FileUploadConfig;
public static function getPaths() {
return [];
}
}
这在 php 7 中已修复,因此以下代码有效:
<?php
error_reporting(-1);
trait FileConfig {
public static function getPathForUploads() {
echo static::getPaths();
}
abstract static function getPaths();
}
class AppConfig {
use FileConfig;
protected static function getPaths() {
return "hello world";
}
}
AppConfig::getPathForUploads();
http://sandbox.onlinephpfunctions.com/code/610f3140b056f3c3e8defb84e6b57ae61fbafbc9
但在编译时并没有真正检查AppConfig中的方法是否为static。只有在尝试静态调用非静态方法时才会收到警告:http://sandbox.onlinephpfunctions.com/code/1252f81af34f71e901994af2531104d70024a685