Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通过$this访问静态方法_Php_Static Methods - Fatal编程技术网

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()');