3

codeigniter コントローラーにメソッドがあり、URL を介して呼び出されることもあれば、コントローラーの別のメソッドから内部的に呼び出されることもあります。内部で呼び出すときは、引数の配列を渡します。メソッドの簡略化されたバージョン:

(コントローラ内)

function get_details($args='') {

    if (isset($args['first_name'])) 
    {
        $first_name = $args['first_name'];
    } 
    else
    {
        $first_name = $this->uri->segment(3);
    } 

    ... do some other stuff ...

}

メソッドは次のように呼び出されます。

<domain>/<controller>/get_details/abcd/efgh 

またはコントローラの別の機能から:

$this->get_details(array('first_name'=>'abcd', 'last_name'=>'efgh'));

メソッドが URL を介して呼び出されたときに isset($args['first_name']) が false になることを期待していましたが、この方法で呼び出されたように見えます引数がそこにあります。私はいくつかのものを印刷しようとしましたが、これは私が得たものです:

print_r($args)  ---->   abcd

echo($args['first_name'])  ----> a

echo($args['whatever_index_I_use'])  ----> a  

URL の 3 番目のパラメーターが (codeigniter によって) メソッドに渡されているようですが、配列インデックスが設定されているように見える理由がわかりません。php が文字列を int に変換していると考えられます。 、だから$args['whatever_index_I_use'], becomes $args[0]??

これがコードイグナイターの問題なのか、微妙なphpが欠けているのかはわかりません。

何が起こっているのか説明できる人に感謝します。

ありがとう。

4

3 に答える 3

4

これがバグなのか、予想される動作なのかはわかりませんが、Stringsのドキュメントには、何が起きているかを正確に示すコメントがあります。文字列のテキストとインデックスを使用すると、最初の文字が返されます。これを回避するには、引数が配列か文字列かを最初に確認します。

if(is_array($args)) {
    echo($args['first_name']);
}
于 2012-05-09T15:58:14.717 に答える
2

@SérgioMichelsの回答を完成させるために、その理由は、PHPが指定されたインデックスとして整数を期待しているためです。文字列を与えると、PHP は文字列を整数にキャストします。文字列が数字で始まらないと仮定すると、型キャストは 0 を返します。それ以外の場合は先頭の数字を返します。

$str = 'abcdefghi';
var_dump($str['no_number']); // Outputs: string(1) "a"
var_dump($str['3something']); // Outputs: string(1) "d"
于 2012-05-09T22:03:11.337 に答える
1

あなたの質問に具体的に答えるには - これはあなたのバグを解決します:

function get_details($args='') 
{
    if (is_array($args))
    {
        $first_name = $args['first_name'];
    } 
    else
    {
        $first_name = $this->uri->segment(3);
    } 
    ... do some other stuff ...
}

しかし、あなたのコードにはいくつかの問題があります。まず、メソッドを次のように呼び出すと述べます

<domain>/<controller>/get_details/abcd/efgh 

ただし、コントローラーで「efgh」変数を受け入れません。これを行うには、関数を次のように変更する必要があります

function get_details($first, $last) 

その場合、関数を次のように呼び出すことができます

$this->get_details('abcd', 'efgh');

そして今では、配列などをテストする必要さえありません。これは、IMO のより良い解決策です。

配列に固執する場合は、次のように変更します。

$first_name = $this->uri->segment(3);

$first_name = $args;

なぜなら、定義上、$args は 3 番目の URI セグメントだからです。

于 2012-05-09T17:03:54.230 に答える