PHP 如何从静态访问非静态方法
How to access to non-static method from static in PHP
有一个Class
class SomeClass1{
public static function myStatic($arg){
return (new SomeClass1)->myMethod($arg);
}
public function myMethod($arg){
return $arg;
}
}
var_dump((SomeClass1::myStatic('123')));
我真的不喜欢这部分
(new SomeClass1)->myMethod($arg);
还有其他方法吗?
更新
我也可以这样称呼它
(new static)->myMethod($arg);
如果您必须这样做,则可能表明该方法应该是静态的。如果您想调用非静态函数,您需要一个对象的实例。
话虽如此,获取对象的选项有很多。也许你做了一个新的,临时的(就像你的例子一样)。也许有一个静态 class 变量是 class 的一个实例,用于执行此类操作。
如果 myMethod($arg)
不需要 return 实例化对象的状态(根据您的示例代码,它不需要),那么您应该将该方法设为静态,并且用 var_dump( SomeClass1::myMethod('123') );
调用它
如果您这样做是因为您还需要在 实例化时从对象内部调用该方法,您可以从另一个方法中使用 self::myMethod('123')
.
简短的回答是否定的。
长答案是否定的,您应该完全避免编写静态方法。静态方法使测试更难。你可能还没有到测试代码的地步(你应该立即开始),但你现在至少可以做的是停止编写静态方法来帮助自己。硬停。没有例外。
我意识到创建一个实例只是为了使用一个没有状态的方法似乎是额外的输入,但从长远来看 运行 它会得到回报。
对为什么静态方法很糟糕的一些支持:
http://googletesting.blogspot.com/2008/12/static-methods-are-death-to-testability.html
http://www.giorgiosironi.com/2009/11/mocking-static-methods-road-to-hell.html
导致问题的不是测试方法本身,而是当您测试其他 类 和依赖其他静态方法的方法时——迫使您通常设置大量上下文来获取所有内容其他静态的东西可以工作,所以你可以测试你关心的当前方法。模拟您的依赖项要容易得多,因此您可以直接测试主题。
如果您需要资源来进行测试,这里有一个(有很多!)。 http://www.sitepoint.com/tutorial-introduction-to-unit-testing-in-php-with-phpunit/
有一个Class
class SomeClass1{
public static function myStatic($arg){
return (new SomeClass1)->myMethod($arg);
}
public function myMethod($arg){
return $arg;
}
}
var_dump((SomeClass1::myStatic('123')));
我真的不喜欢这部分
(new SomeClass1)->myMethod($arg);
还有其他方法吗?
更新 我也可以这样称呼它
(new static)->myMethod($arg);
如果您必须这样做,则可能表明该方法应该是静态的。如果您想调用非静态函数,您需要一个对象的实例。
话虽如此,获取对象的选项有很多。也许你做了一个新的,临时的(就像你的例子一样)。也许有一个静态 class 变量是 class 的一个实例,用于执行此类操作。
如果 myMethod($arg)
不需要 return 实例化对象的状态(根据您的示例代码,它不需要),那么您应该将该方法设为静态,并且用 var_dump( SomeClass1::myMethod('123') );
如果您这样做是因为您还需要在 实例化时从对象内部调用该方法,您可以从另一个方法中使用 self::myMethod('123')
.
简短的回答是否定的。
长答案是否定的,您应该完全避免编写静态方法。静态方法使测试更难。你可能还没有到测试代码的地步(你应该立即开始),但你现在至少可以做的是停止编写静态方法来帮助自己。硬停。没有例外。
我意识到创建一个实例只是为了使用一个没有状态的方法似乎是额外的输入,但从长远来看 运行 它会得到回报。
对为什么静态方法很糟糕的一些支持:
http://googletesting.blogspot.com/2008/12/static-methods-are-death-to-testability.html
http://www.giorgiosironi.com/2009/11/mocking-static-methods-road-to-hell.html
导致问题的不是测试方法本身,而是当您测试其他 类 和依赖其他静态方法的方法时——迫使您通常设置大量上下文来获取所有内容其他静态的东西可以工作,所以你可以测试你关心的当前方法。模拟您的依赖项要容易得多,因此您可以直接测试主题。
如果您需要资源来进行测试,这里有一个(有很多!)。 http://www.sitepoint.com/tutorial-introduction-to-unit-testing-in-php-with-phpunit/