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解析エラー:構文エラー、予期しない'::'(T_PAAMAYIM_NEKUDOTAYIM)/home/jorgee/www/menu/controller/CT_Menu.phpの11行目

明らかに私は静的メソッドにひどくアクセスしていますが、それが方法だと思いました、何か助けはありますか?

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 に答える