Ethna2.3.5とEthna2.6betaを比較する (その3)

Ethna_ActionClassの比較

↓比較コマンドとその結果
$ diff ETHNA_2_3_5kai/class/ActionClass.php  Ethna-2.6.2011010402/class/ActionClass.php -uEbwB

--- ETHNA_2_3_5kai/class/ActionClass.php	2011-05-07 22:10:00.000000000 +0900
+++ Ethna-2.6.2011010402/class/ActionClass.php	2010-12-27 03:32:46.000000000 +0900
@@ -1,12 +1,12 @@
 
  *  @license    http://www.opensource.org/licenses/bsd-license.php The BSD License
  *  @package    Ethna
- *  @version    $Id$
+ *  @version    $Id: fe3fef6769eb39580c681736db08e0f2cbbbed01 $
  */
 
 // {{{ Ethna_ActionClass
@@ -23,32 +23,38 @@
      *  @access private
      */
 
-    /** @var    object  Ethna_Backend       backendオブジェクト */
-    var $backend;
+    /** @protected    object  Ethna_Backend       backendオブジェクト */
+    protected $backend;
 
-    /** @var    object  Ethna_Config        設定オブジェクト    */
-    var $config;
+    /** @protected    object  Ethna_Config        設定オブジェクト    */
+    protected $config;
 
-    /** @var    object  Ethna_I18N          i18nオブジェクト */
-    var $i18n;
+    /** @protected    object  Ethna_I18N          i18nオブジェクト */
+    protected $i18n;
 
-    /** @var    object  Ethna_ActionError   アクションエラーオブジェクト */
-    var $action_error;
+    /** @protected    object  Ethna_ActionError   アクションエラーオブジェクト */
+    protected $action_error;
 
-    /** @var    object  Ethna_ActionError   アクションエラーオブジェクト(省略形) */
-    var $ae;
+    /** @protected    object  Ethna_ActionError   アクションエラーオブジェクト(省略形) */
+    protected $ae;
 
-    /** @var    object  Ethna_ActionForm    アクションフォームオブジェクト */
-    var $action_form;
+    /** @protected    object  Ethna_ActionForm    アクションフォームオブジェクト */
+    protected $action_form;
 
-    /** @var    object  Ethna_ActionForm    アクションフォームオブジェクト(省略形) */
-    var $af;
+    /** @protected    object  Ethna_ActionForm    アクションフォームオブジェクト(省略形) */
+    protected $af;
 
-    /** @var    object  Ethna_Session       セッションオブジェクト */
-    var $session;
+    /** @protected    object  Ethna_Session       セッションオブジェクト */
+    protected $session;
 
-    /** @var    object  Ethna_Plugin        プラグインオブジェクト */
-    var $plugin;
+    /** @public    object  Ethna_Plugin        プラグインオブジェクト */
+    public $plugin;
+
+    /** @protected    object  Ethna_Logger    ログオブジェクト */
+    protected $logger;
+
+    /** @protected    array   Preload plugins definition  */
+    protected $plugins = array();
 
     /**#@-*/
 
@@ -58,21 +64,24 @@
      *  @access public
      *  @param  object  Ethna_Backend   $backend    backendオブジェクト
      */
-    function Ethna_ActionClass(&$backend)
+    public function __construct($backend)
     {
-        $c =& $backend->getController();
-        $this->backend =& $backend;
-        $this->config =& $this->backend->getConfig();
-        $this->i18n =& $this->backend->getI18N();
-
-        $this->action_error =& $this->backend->getActionError();
-        $this->ae =& $this->action_error;
-
-        $this->action_form =& $this->backend->getActionForm();
-        $this->af =& $this->action_form;
+        $c = $backend->getController();
+        $this->backend = $backend;
+        $this->config = $this->backend->getConfig();
+        $this->i18n = $this->backend->getI18N();
+
+        $this->action_error = $this->backend->getActionError();
+        $this->ae = $this->action_error;
+
+        $this->action_form = $this->backend->getActionForm();
+        $this->af = $this->action_form;
+
+        $this->session = $this->backend->getSession();
+        $this->plugin = $this->backend->getPlugin();
+        $this->logger = $this->backend->getLogger();
 
-        $this->session =& $this->backend->getSession();
-        $this->plugin =& $this->backend->getPlugin();
+        $this->preloadPlugin();
     }
 
     /**
@@ -81,7 +90,7 @@
      *  @access public
      *  @return string  遷移名(nullなら正常終了, falseなら処理終了)
      */
-    function authenticate()
+    public function authenticate()
     {
         return null;
     }
@@ -92,7 +101,7 @@
      *  @access public
      *  @return string  遷移名(nullなら正常終了, falseなら処理終了)
      */
-    function prepare()
+    public function prepare()
     {
         return null;
     }
@@ -103,10 +112,31 @@
      *  @access public
      *  @return string  遷移名(nullなら遷移は行わない)
      */
-    function perform()
+    public function perform()
     {
         return null;
     }
+
+    /**
+     *  get plugin object
+     *
+     *  @access protected
+     */
+    protected function preloadPlugin()
+    {
+        foreach ($this->plugins as $alias => $plugin) {
+            $plugin_alias = $alias;
+            if (is_int($alias)) {
+                $plugin_alias = $plugin;
+            }
+
+            $plugin_name = explode('_', $plugin);
+            if (count($plugin_name) === 1) {
+                $plugin_alias[] = null;
+            }
+
+            $this->plugin->setPlugin($plugin_alias, $plugin_name);
+        }
+    }
 }
 // }}}
-?>

分析する

ざっくり見てみると、
1.コンストラクタが __construct になった
2.プロパティが var → protected になった
3.authenticate, prepare, perform に public がついた
4.preloadPluginメソッドが増えた

1.コンストラクタが __construct に
下方互換性はどうなんだろ?
派生クラス側で、parent::Ethna_ActionClassとやっていると問題が起こるかもしれない。(後で調べます)

【追記】
やはり、互換性に問題がある。
派生クラス側をparent::__construct に修正する必要がある。

2.プロパティが var → protected になった
これは大きい。
シンタックス的にはpublicからprotectedへ変わったことになる。
他のクラスから$actionClass->af などとしている場合に文法エラーになってしまう。
差分のアップグレードは慎重にやらないといけない。
(もちろん、@protected というdocblockの指示をちゃんと守っていれば問題ないのだけど、そんな紳士協定はあてにできないので)

3.authenticate, prepare, perform に public がついた
これは、シンタックス的にはpublicあってもなくても同じなので問題ない。

4.preloadPluginメソッドが増えた
よくわからないので後回し。

総論

2の変化が最も影響が大きいと思われる。
ここは当分var(またはpublic)のままにしておいた方がよさそうだ。
カテゴリ: