0

我有以下内容:

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 解析错误:语法错误,第 11 行 /home/jorgee/www/menu/controller/CT_Menu.php 中的意外 '::' (T_PAAMAYIM_NEKUDOTAYIM)

显然我对静态方法的访问很糟糕,但我认为这就是方法,有什么帮助吗?

4

2 回答 2

1

正确的方法是替换它:

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

有了这个:

$action = HP_Utils::getAction();

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

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

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

于 2013-01-07T17:29:24.763 回答
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()');

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

于 2013-01-07T17:32:27.347 回答