OSDN Git Service

FIX: リファレンスにまつわるコードを修正
authorsakamocchi <o-takashi@sakamocchi.jp>
Mon, 17 Sep 2012 05:48:48 +0000 (14:48 +0900)
committersakamocchi <o-takashi@sakamocchi.jp>
Mon, 17 Sep 2012 05:48:48 +0000 (14:48 +0900)
1. リファレンス渡しは関数定義でのみ有効であり、関数呼び出しでは致命的なエラーとなる
参照: http://php.net/manual/en/language.references.pass.php
引用: 「注意: 関数コールの際には、リファレンス記号がないことに注意してください。
関数定義にのみリファレンス記号があります。リファレンスで正しく引数を 渡すには、関数定義のみで十分です。以前のバージョンの PHP では
foo(&$a); のような形式で & を利用すると "Call-time pass-by-reference"
という警告が発生していましたが、 PHP 5.3.0 以降では警告は発生しません。 また、PHP 5.4.0 以降では
call-time pass-by-reference 機能自体が削除されたので、 これを使おうとすると fatal エラーが発生します。」

2.callableタイプヒントとして配列宣言をしてオブジェクトのインスタンスとメソッドを渡す場合、配列の一つ目のインスタンスは自動でリファレンス参照として扱われる。
参照: http://php.net/manual/en/language.types.callable.php
引用: 「注意: PHP 4 では、実際のオブジェクトを指すコールバックを作成するには、
コピーではなく参照を使わなければなりませんでした。 詳細は 参照についての説明 を参照ください。」

上記を踏まえ、参照を伴うcall_user_func()/call_user_func_array()、array_merge()の関数呼び出しを修正したほか、より誤解の少ないコードに変更した。

12 files changed:
nucleus/convert/functions.inc.php
nucleus/libs/ACTIONS.php
nucleus/libs/AdminActions.php
nucleus/libs/BODYACTIONS.php
nucleus/libs/BaseActions.php
nucleus/libs/COMMENTACTIONS.php
nucleus/libs/ITEMACTIONS.php
nucleus/libs/MANAGER.php
nucleus/libs/MEDIA.php
nucleus/libs/PARSER.php
nucleus/libs/PLUGIN.php
nucleus/libs/xmlrpcs.inc.php

index 9625594..be81999 100644 (file)
@@ -228,8 +228,10 @@ class BlogImport {
                }
 
                // - call callback
-               if ($this->strCallback && function_exists($this->strCallback)) {
-                       call_user_func_array($this->strCallback, array(&$aData));
+               if ( $this->strCallback && function_exists($this->strCallback) )
+               {
+                       $params = array(&$aData);
+                       call_user_func_array($this->strCallback, $params);
                }
 
                if ($this->bDebug) {
index 8053ec0..5e865a5 100644 (file)
@@ -405,7 +405,7 @@ class Actions extends BaseActions
                $params = func_get_args();
                array_shift($params);
                
-               return call_user_func_array(array(&$plugin, 'doIf'), $params);
+               return call_user_func_array(array($plugin, 'doIf'), $params);
        }
        
        /**
@@ -1865,7 +1865,7 @@ class Actions extends BaseActions
                // add skin type on front
                array_unshift($params, $this->skintype);
                
-               call_user_func_array(array(&$plugin,'doSkinVar'), $params);
+               call_user_func_array(array($plugin,'doSkinVar'), $params);
                return;
        }
        
index 15e62ad..880ea41 100644 (file)
@@ -960,7 +960,8 @@ class AdminActions extends BaseActions
                                case 'delete':
                                        if ( $this->skintype != 'batchteam' )
                                        {
-                                               $error = call_user_func_array(array('Admin', $deleteaction), array($selectedid));
+                                               $params = array($selectedid);
+                                               $error = call_user_func_array(array('Admin', $deleteaction), $params);
                                        }
                                        else
                                        {
@@ -968,7 +969,8 @@ class AdminActions extends BaseActions
                                        }
                                        break;
                                case 'move':
-                                       $error = call_user_func_array(array('Admin', $moveaction), array($selectedid, $destid));
+                                       $params = array($selectedid, $destid);
+                                       $error = call_user_func_array(array('Admin', $moveaction), $params);
                                        break;
                                case 'setadmin':
                                        // always succeeds
@@ -4361,7 +4363,7 @@ class AdminActions extends BaseActions
                        
                        if ( method_exists($this, $met) )
                        {
-                               $value = call_user_func(array(&$this, $met), $arg);
+                               $value = call_user_func(array($this, $met), $arg);
                        }
                }
                
@@ -4852,7 +4854,7 @@ class AdminActions extends BaseActions
                $params = func_get_args();
                array_shift($params);
                
-               return call_user_func_array(array(&$plugin, 'doIf'), $params);
+               return call_user_func_array(array($plugin, 'doIf'), $params);
        }
        
        /**
index 8122927..06b4f9d 100644 (file)
@@ -107,9 +107,10 @@ class BodyActions extends BaseActions
                array_shift($params);
                
                // add item reference (array_unshift didn't work)
-               $params = array_merge(array(&$this->currentItem), $params);
+               $target = array(&$this->currentItem);
+               $params = array_merge($target, $params);
                
-               call_user_func_array(array(&$plugin, 'doItemVar'), $params);
+               call_user_func_array(array($plugin, 'doItemVar'), $params);
                return;
        }
        
@@ -126,7 +127,7 @@ class BodyActions extends BaseActions
                // image/popup calls have arguments separated by |
                $args = func_get_args();
                $args = preg_split('#\|#', implode($args, ', '));
-               echo call_user_func_array(array(&$this, 'createImageCode'), $args);
+               echo call_user_func_array(array($this, 'createImageCode'), $args);
        }
        
        /**
@@ -174,7 +175,7 @@ class BodyActions extends BaseActions
                // image/popup calls have arguments separated by |
                $args = func_get_args();
                $args = preg_split('#\|#', implode($args, ', '));
-               echo call_user_func_array(array(&$this, 'createMediaCode'), $args);
+               echo call_user_func_array(array($this, 'createMediaCode'), $args);
        }
        
        /**
@@ -215,7 +216,7 @@ class BodyActions extends BaseActions
                // image/popup calls have arguments separated by |
                $args = func_get_args();
                $args = preg_split('#\|#', implode($args, ', '));
-               echo call_user_func_array(array(&$this, 'createPopupCode'), $args);
+               echo call_user_func_array(array($this, 'createPopupCode'), $args);
        }
        
        /**
@@ -558,6 +559,6 @@ class BodyActions extends BaseActions
                $params = func_get_args();
                array_shift($params);
                
-               return call_user_func_array(array(&$plugin, 'doIf'), $params);
+               return call_user_func_array(array($plugin, 'doIf'), $params);
        }
 }
index 5c8bf16..410804e 100644 (file)
@@ -434,7 +434,7 @@ class BaseActions
        {
                $this->addIfExecute();
                $args = func_get_args();
-               $condition = call_user_func_array(array(&$this,'checkCondition'), $args);
+               $condition = call_user_func_array(array($this,'checkCondition'), $args);
                $this->addIfCondition($condition);
                return;
        }
@@ -505,7 +505,7 @@ class BaseActions
                {
                        ob_end_clean();
                        $args = func_get_args();
-                       $condition = call_user_func_array(array(&$this,'checkCondition'), $args);
+                       $condition = call_user_func_array(array($this,'checkCondition'), $args);
                        $this->addIfCondition($condition);
                }
                return;
@@ -523,7 +523,7 @@ class BaseActions
                $this->addIfExecute();
                
                $args = func_get_args();
-               $condition = call_user_func_array(array(&$this,'checkCondition'), $args);
+               $condition = call_user_func_array(array($this,'checkCondition'), $args);
                $this->addIfCondition(!$condition);
                return;
        }
@@ -559,7 +559,7 @@ class BaseActions
                {
                        ob_end_clean();
                        $args = func_get_args();
-                       $condition = call_user_func_array(array(&$this,'checkCondition'), $args);
+                       $condition = call_user_func_array(array($this,'checkCondition'), $args);
                        $this->addIfCondition(!$condition);
                }
                return;
index ce5ab4e..96bdb10 100644 (file)
@@ -537,10 +537,12 @@ class CommentActions extends BaseActions
                array_shift($params);
                
                // pass info on current item and current comment as well
-               $params = array_merge(array(&$this->currentComment), $params);
-               $params = array_merge(array(&$this->commentsObj->itemActions->currentItem), $params);
+               $target = array(&$this->currentComment);
+               $params = array_merge($target, $params);
+               $target = array(&$this->commentsObj->itemActions->currentItem);
+               $params = array_merge($target, $params);
                
-               call_user_func_array(array(&$plugin,'doTemplateCommentsVar'), $params);
+               call_user_func_array(array($plugin,'doTemplateCommentsVar'), $params);
                return;
        }
        
@@ -1005,6 +1007,6 @@ class CommentActions extends BaseActions
                $params = func_get_args();
                array_shift($params);
                
-               return call_user_func_array(array(&$plugin, 'doIf'), $params);
+               return call_user_func_array(array($plugin, 'doIf'), $params);
        }
 }
index 1a37831..2306fa3 100644 (file)
@@ -753,9 +753,10 @@ class ItemActions extends BaseActions
                array_shift($params);
                
                // add item reference (array_unshift didn't work)
-               $params = array_merge(array(&$this->currentItem),$params);
+               $target = array(&$this->currentItem);
+               $params = array_merge($target,$params);
                
-               call_user_func_array(array(&$plugin,'doTemplateVar'), $params);
+               call_user_func_array(array($plugin,'doTemplateVar'), $params);
                return;
        }
        
@@ -1121,6 +1122,6 @@ class ItemActions extends BaseActions
                $params = func_get_args();
                array_shift($params);
                
-               return (boolean) call_user_func_array(array(&$plugin, 'doIf'), $params);
+               return (boolean) call_user_func_array(array($plugin, 'doIf'), $params);
        }
 }
index 197c426..fa45dfa 100644 (file)
@@ -571,7 +571,7 @@ class Manager
                                  && !empty($this->plugins[$listener])
                                  && method_exists($this->plugins[$listener], 'event_' . $eventName) )
                                {
-                                       call_user_func(array(&$this->plugins[$listener], 'event_' . $eventName), $data);
+                                       call_user_func(array($this->plugins[$listener], 'event_' . $eventName), $data);
                                }
                        }
                }
index 8293d01..422fd16 100644 (file)
@@ -737,7 +737,7 @@ class MediaObject
                        return FALSE;
                }
                
-               $original = call_user_func_array($function, array(&$fullpath));
+               $original = call_user_func_array($function, $fullpath);
                if ( !$original )
                {
                        return FALSE;
index b84f02b..406fe8c 100644 (file)
@@ -135,7 +135,7 @@ class Parser
                
                if ( in_array($actionlc, $this->actions) || $this->norestrictions )
                {
-                       call_user_func_array(array(&$this->handler, "parse_{$actionlc}"), $params);
+                       call_user_func_array(array($this->handler, "parse_{$actionlc}"), $params);
                }
                else
                {
index 4a34c6b..4cebb26 100644 (file)
@@ -99,7 +99,7 @@ abstract class NucleusPlugin
                $args = func_get_args();
                array_shift($args);
                array_unshift($args, 'template');
-               call_user_func_array(array(&$this,'doSkinVar'),$args);
+               call_user_func_array(array($this, 'doSkinVar'), $args);
                return;
        }
        
@@ -109,7 +109,7 @@ abstract class NucleusPlugin
                array_shift($args);
                array_shift($args);
                array_unshift($args, 'template');
-               call_user_func_array(array(&$this,'doSkinVar'),$args);
+               call_user_func_array(array($this, 'doSkinVar'), $args);
                return;
        }
        
index e595e6b..ebb58a5 100644 (file)
                                        // 3rd API convention for method-handling functions: EPI-style
                                        if ($this->functions_parameters_type == 'epivals')
                                        {
-                                               $r = call_user_func_array($func, array($methName, $params, $this->user_data));
+                                               $params = array($methName, $params, $this->user_data);
+                                               $r = call_user_func_array($func, $params);
                                                // mimic EPI behaviour: if we get an array that looks like an error, make it
                                                // an eror response
                                                if (is_array($r) && array_key_exists('faultCode', $r) && array_key_exists('faultString', $r))