74
function parts($part) { 
    $structure = 'http://' . $site_url . 'content/'; 
    echo($tructure . $part . '.php'); 
}

この関数は、$site_urlこのページの上部で定義された変数を使用していますが、この変数は関数に渡されていません。

関数に戻すにはどうすればよいですか?

4

6 に答える 6

150

2番目のパラメーターを追加します

関数に追加のパラメーターを渡す必要があります。

function parts($site_url, $part) { 
    $structure = 'http://' . $site_url . 'content/'; 
    echo $structure . $part . '.php'; 
}

閉鎖の場合

クロージャを使用したい場合は、変数を現在のスコープ(useキーワード)にインポートできます。

$parts = function($part) use ($site_url) { 
    $structure = 'http://' . $site_url . 'content/'; 
    echo $structure . $part . '.php'; 
};

global-悪い習慣

この投稿は頻繁に読まれるので、何かを明確にする必要がありますglobal。それを使用することは悪い習慣と見なされます(これこれを参照してください)。

完全を期すために、ここに以下を使用するソリューションがありますglobal

function parts($part) { 
    global $site_url;
    $structure = 'http://' . $site_url . 'content/'; 
    echo($structure . $part . '.php'); 
}

これは、グローバル変数を使用することをインタープリターに指示する必要があるために機能します。これで、(関数内の)ローカル変数であると見なされます。

推奨読書:

于 2012-06-18T16:11:24.237 に答える
46

useまたは、キーワードでクロージャを使用して、スコープ外から変数を取り込むこともできます。

$myVar = "foo";
$myFunction = function($arg1, $arg2) use ($myVar)
{
 return $arg1 . $myVar . $arg2;
};
于 2012-06-18T16:13:15.000 に答える
7

useこれらの変数を参照によって渡すこともできることを忘れないでください。

ユースケースは、コールバック内から'd変数を変更する必要がある場合ですuse(たとえば、オブジェクトのソース配列からさまざまなオブジェクトの新しい配列を生成します)。

$sourcearray = [ (object) ['a' => 1], (object) ['a' => 2]];
$newarray = [];
array_walk($sourcearray, function ($item) use (&$newarray) {
    $newarray[] = (object) ['times2' => $item->a * 2];
});
var_dump($newarray);

ここで$newarray構成されます(簡潔にするためにここでは擬似コード) [{times2:2},{times2:4}]

逆に、修飾子$newarrayなしで使用すると、クロージャスコープ内から外部変数に読み取り専用でアクセスできるようになります。しかし、クロージャスコープ内には、クロージャスコープ内でのみ存在する完全に異なる新しく作成された変数があります。&$newarray$newarray

両方の変数の名前は同じですが、これらは2つの異なる変数になります。この場合、外部$newarray変数は[]コードが終了した後に構成されます。

于 2018-09-22T17:32:26.557 に答える
2

これはあなたのアーキテクチャやあなたが考慮する必要があるかもしれない他のものに依存すると思いますが、オブジェクト指向のアプローチを取り、クラスを使用することもできます。

class ClassName {

    private $site_url;

    function __construct( $url ) {
        $this->site_url = $url;
    }

    public function parts( string $part ) {
        echo 'http://' . $this->site_url . 'content/' . $part . '.php';
    }

    # You could build a bunch of other things here
    # too and still have access to $this->site_url.
}

その後、好きな場所でオブジェクトを作成して使用できます。

$obj = new ClassName($site_url);
$obj->parts('part_argument');

これは、OPが具体的に達成しようとしていたことにはやり過ぎかもしれませんが、まだ誰も言及していないので、少なくとも私が新参者のためにテーブルに置きたかったオプションです。

ここでの利点は、スケーラビリティと封じ込めです。たとえば、共通のタスクのために複数の関数への参照と同じ変数を渡す必要がある場合、それはクラスが正常であることを示している可能性があります。

于 2020-12-23T22:10:28.103 に答える
1

同様の質問がありました。回答:グローバルを使用してください。そして、他のオプションがあります。しかし、スコープ外を使用する名前付き関数が必要な場合は、ここに私が持っているものがあります:

global $myNamedFunctionWidelyAccessibleCallableWithScope;
$myNamedFunctionWidelyAccessibleCallableWithScope =
    function ($argument) use ($part, $orWhatYouWant) {
        echo($argument . $part . '.php');
        // do something here
        return $orWhatYouWant;
    };
function myNamedFunctionWidelyAccessible(string $argument)
{
    global $myNamedFunctionWidelyAccessibleCallableWithScope;
    return $myNamedFunctionWidelyAccessibleCallableWithScope($argument);
}

これは、関数myNamedFunctionWidelyAccessibleをどこからでもアクセスできるようにするのに役立ちますが、スコープとバインドすることもできます。そして、私は故意に非常に長い名前を付けました、グローバルなものは悪です:(

これが良い例のドキュメントです

于 2021-06-08T11:38:29.633 に答える
0

GLOBALキーワードを使用して関数を入力するだけです。

 global $site_url;
于 2012-06-18T16:11:38.480 に答える