Php 通过$this访问静态方法
我有以下资料:Php 通过$this访问静态方法,php,static-methods,Php,Static Methods,我有以下资料: class HP_Utils { /**********************************************************************/ public static function getAction() /**********************************************************************/ { if( isset( $_GET[ 'action' ] ) ) { r
class HP_Utils {
/**********************************************************************/
public static function getAction()
/**********************************************************************/
{
if( isset( $_GET[ 'action' ] ) ) {
return $_GET[ 'action' ];
}
else if ( isset( $_POST[ 'action' ] )) {
return $_POST[ 'action' ];
}
}
/**********************************************************************/
}
然后在另一节课上:
$this->utils = $this->load( 'helper', 'Utils' );
$action = $this->utils::getAction(); <============== ERROR
给我一个错误:
PHP分析错误:语法错误,意外“:”
(T_PAAMAYIM_NEKUDOTAYIM)在
/第11行的home/jorgee/www/menu/controller/CT_menu.php
显然,我对静态方法的理解很差,但我认为这就是方法,有什么帮助吗?正确的方法是替换此方法:
$action = $this->utils::getAction(); <============== ERROR
我相信您也可以在PHP中调用静态方法,就像调用实例方法一样,如下所示:
$action = $this->utils->getAction();
但是第一个版本通常更好,因为它清楚地表明您实际上调用的是静态方法而不是实例方法。$this->load()
返回一个对象,而不是类。因此,当调用$this->utils::getAction()
时,会出现一个错误
我建议直接使用类名,HP\u Utils::getAction()
,但如果需要动态,可以使用call\u user\u func
:
abstract class MController {
/**********************************************************************/
protected function load( $type, $className ) {
switch( $type ) {
case 'model':
$name = 'MD_' . $className;
break;
case 'view':
$name = 'VW_' . $className;
break;
case 'helper';
$name = 'HP_' . $className;
break;
}
$path = $type . '/' . $name . '.php';
include( $path );
return $name;
}
//The actual calling code :
$this->utils = $this->load( 'helper', 'Utils' );
$action = call_user_func($this->utils . '::getAction()');
请注意,这是一种非常丑陋的方法来调用某些方法。您应该扪心自问,这里是否存在设计问题。为什么要将静态类存储到变量中?静态方法可以在没有实例的情况下通过
ClassName::methodName()
全局访问。加载程序实例化util类对象,为什么不作为常规方法调用$this->util->getAction()来访问它呢代码>(即使是静态的,也可以作为实例方法调用)@Crisp它根本不是完全有效的。这与所有的OOP原则相反,而且只有在PHP允许的情况下才有可能实现,因为它的OOP功能曾经很弱,现在它们保持了BC@ClementHerreman明白了,从PHP解释器的角度来看,我的意思是完全可以。@ClementHerreman很抱歉重复这句话,但您在其他评论中提到了弃用错误,但是没有,至少在php5.4.9中是这样,实际上static关键字的手册页上说,声明为static的属性不能用实例化的类对象访问(**尽管静态方法可以**).
没有提到该功能即将遭到弃用。有什么原因不能从实例调用静态方法吗?(可能是OOP基本理论:P)@Jorge-刚刚编辑了我的答案-我相信你可以在PHP中做到这一点,或者至少在一些旧版本中可以做到。@Jorge确实是,基本OOP理论。静态方法,顾名思义,是类范围的,而不是对象范围的,因此您可以从类中调用它们。PHP可以容忍这种情况,因为PHP4.x中有一些旧的BC,但您应该使用它。我相信这会引起一些不赞成的错误
$action = $this->utils->getAction();
abstract class MController {
/**********************************************************************/
protected function load( $type, $className ) {
switch( $type ) {
case 'model':
$name = 'MD_' . $className;
break;
case 'view':
$name = 'VW_' . $className;
break;
case 'helper';
$name = 'HP_' . $className;
break;
}
$path = $type . '/' . $name . '.php';
include( $path );
return $name;
}
//The actual calling code :
$this->utils = $this->load( 'helper', 'Utils' );
$action = call_user_func($this->utils . '::getAction()');