PHP报错Fatal error: Cannot make non static method的一些坑
作者:PHPYuan 时间:2018-06-25 23:40:34
这几天在研究php的设计模式,偶然碰到了这样一个错误,百思不得解,现记录下来,以备将来所需:<?php
interface Car{
function run();
function stop();
}
class Bmw implements Car{
function run(){
echo '宝马车在运行中...';
}
function stop(){
echo '宝马车停在路边...';
}
}
class Audi implements Car{
function run(){
echo '奥迪车在运行中...';
}
function stop(){
echo '奥迪车停在路边...';
}
}
abstract class Factory{
public abstract function create();
}
class FactoryBmw extends Factory{
static function create(){
return new Bmw();
}
} //报错是这里:Fatal error: Cannot make non static method Factory::create() static in class FactoryBmw in D:\project\www\php\class\Car.class.php on line 36
class FactoryAudi extends Factory{
static function create(){
return new Audi();
}
}
报错的是注释是地方,开始我以为是父类Factory的方法create没有设置成static,但是给这个方法添加static之后,报错的就是这个地方了,查了资料才发现从PHP 5.2开始,不再允许同时使用abstract static 修饰一个抽象类的抽象方法。也就是说,PHP不再支持抽象静态方法,继续使用,将导致E_STRICT错误。也就是说以下代码是错误的。abstract class Factory{
abstract static function create();
}
不能在父类中添加抽象的静态方法,那么子类中的create方法就不能是静态的,一时陷入两难的境地。
就是快要放弃时,突然想到在接口中可以定义静态方法,试了一下发现可以了,上代码:interface IFactory{
static function create();
}
abstract class Factory implements IFactory{
}
class FactoryBmw extends Factory{
static function create(){
return new Bmw();
}
}
class FactoryAudi extends Factory{
static function create(){
return new Audi();
}
}
由于在接口中可以定义抽象的静态方法,当用一个抽象类实现接口时,这个抽象就“继承”了这个抽象的静态方法,算是一种曲线求国吧,不知道有没有大神可以解释一下。^_^
分享到:
>> 下一篇:关于Web架构的一些事 (2018-06-25 23:40)