web-dev-qa-db-ja.com

php include / requireコンストラクトにパラメーターを渡す

私がこれから尋ねようとしている質問に非常によく似たかなりの数の投稿を読みましたが、これを行うためのより洗練された方法がないことを確認したかっただけです。フィードバックは大歓迎です。

ログインしたユーザーが現在呼び出されているphpスクリプトにアクセスできるかどうかをチェックするメカニズムを作成したいと思います。その場合、スクリプトは続行されます。そうでない場合、スクリプトはdie('you have no access')のようなものを使用して失敗します。

私はこれを達成するために2つの方法を思いついた:

(私のセッションのものがコード化されている/正常に動作していると仮定してください-つまり、session_start()を呼び出し、セッション変数を適切に設定するなど)

  1. 最初にグローバル変数を定義してから、必要なヘッダーファイルでグローバル変数を確認します。例えば:

    Current_executing_script.phpの内容:

    // the role the logged in user must have to continue on   
    $roleNeedToAccessThisFile = 'r';
    require 'checkRole.php''
    

    CheckRole.phpの内容:

    if ($_SESSION['user_role'] != $roleNeedToAccessThisFile) die('no access for you');
    
  2. ヘッダーファイル内で関数を定義し、インクルード/要求した直後に関数を呼び出します。

    CheckRole.phpの内容:

    function checkRole($roleTheUserNeedsToAccessTheFile) {
        return ($_SESSION['user_role'] == $roleTheUserNeedsToAccessTheFile);
    }

    Current_executing_script.phpの内容:

    require 'checkRole.php';
    checkRole('r') or die('no access for you');

基本的に、includeまたはrequireコンストラクトの一部としてcheckRole.phpにパラメーターを渡す方法があるかどうか疑問に思っていますか?

前もって感謝します。

20
JoJoeDad

含めるまたは要求するパラメーターを渡す方法はありません。

ただし、インクルードされたコードは、インクルードした時点でプログラムフローに参加するため、スコープ内のすべての変数を継承します。したがって、たとえば、インクルードの直前に$ myflag = trueを設定すると、インクルードされたコードは$ myflagが何に設定されているかを確認できます。

そうは言っても、私はそのテクニックを使うことを提案しません。インクルードファイルには、すぐに実行されるコードよりも関数(またはクラス)を含める方がはるかに優れています。関数を含むファイルを含めた場合は、プログラムの任意の時点で、必要なパラメーターを使用して関数を呼び出すことができます。これははるかに柔軟性があり、一般的にはより優れたプログラミング手法です。

お役に立てば幸いです。

35
Spudley

パラメータに含める

これは私が最近のWordpressプロジェクトで使用したものです

関数を作成するfunctions.php

function get_template_partial($name, $parameters) {
   // Path to templates
   $_dir = get_template_directory() . '/partials/';
   // Unless you like writing file extensions
   include( $_dir . $name . '.php' );
} 

cards-block.phpでパラメータを取得します。

// $parameters is within the function scope
$args = array(
    'post_type' => $parameters['query'],
    'posts_per_page' => 4
);

テンプレートを呼び出すindex.php

get_template_partial('cards-block', array(
    'query' => 'tf_events'
)); 

コールバックが必要な場合

たとえば、表示された投稿の総数は次のとおりです。

functions.phpを次のように変更します。

function get_template_partial($name, $parameters) {
   // Path to templates
   $_dir = get_template_directory() . '/partials/';
   // Unless you like writing file extensions
   include( $_dir . $name . '.php' );
   return $callback; 
} 

cards-block.phpを次のように変更します。

// $parameters is within the function scope
$args = array(
    'post_type' => $parameters['query'],
    'posts_per_page' => 4
);
$callback = array(
    'count' => 3 // Example
);

index.phpを次のように変更します。

$cardsBlock = get_template_partial('cards-block', array(
    'query' => 'tf_events'
)); 

echo 'Count: ' . $cardsBlock['count'];
3
CodeUK

過去には、多くの人々がこのアプローチに同意していませんでした。しかし、それは意見の問題だと思います。

Require()またはinclude()を介して_GETまたは_POST paramを渡すことはできませんが、最初に_SESSIONキー/値を設定し、反対側でプルすることはできます。

0
eDriven_Levar

必要なファイルに無名関数を返してもらい、その直後に呼び出すことができます。

//required.php

$test = function($param)
{
    //do stuff
}

return $test
//main.php
$testing = require 'required.php';
$testing($arg);
0
kmuenkel