通过$ this访问静态方法

时间:2013-01-07 17:27:23

标签: php static-methods

我有以下内容:

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

装载机:

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 new $name;
}

给我错误:

  

PHP Parse错误:语法错误,意外的'::'   (T_PAAMAYIM_NEKUDOTAYIM)in   第11行/home/jorgee/www/menu/controller/CT_Menu.php

显然我很难访问静态方法,但我认为这是方法,有什么帮助吗?

2 个答案:

答案 0 :(得分:1)

正确的方法是替换它:

$action = $this->utils::getAction(); <============== ERROR

用这个:

$action = HP_Utils::getAction();

我相信你也可以在PHP中调用静态方法,就像它是一个实例方法一样,如下所示:

$action = $this->utils->getAction();

但第一个版本通常更好,因为它非常清楚你实际上是在调用静态方法而不是实例方法。

答案 1 :(得分:1)

$this->load()返回对象,而不是类。因此,当调用$this->utils::getAction()时,您会收到错误。

我会直接使用类名HP_Utils::getAction(),但如果您需要它是动态的,可以使用call_user_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()');

请注意,调用某些方法这是一种非常难看的方法。你应该问自己这里是否有设计问题。