2015-02-04 2 views
0

У меня есть родительская функция, которая передается переменной с именем $scriptName. В зависимости от того, что хранится в $scriptName, я хочу вызвать соответствующий скрипт.Сценарий вызова на основе имени переменной

У меня есть файл с именем childOneScript.php

Если $scriptName=="childOne", как я называю childOneScript.php?

+0

Как будет вызван 'childOneScript.php'? По включению файла или ожидает ли его запрос в браузере? –

+0

'require 'childOneScript.php''. – meagar

ответ

2

Вы можете просто использовать нормальный require

require_once $scriptName . 'Script.php';

Имейте в виду, однако, что если сценарий не существует PHP поднимет фатальную ошибку, так что вы должны проверять, что скрипт делает действительно существуют.

/** 
    Assumes that $name does not contain the PHP extension and 
    this function works with relative paths. 
    If the file does not exist, returns false, true otherwise 
*/ 
function loadScript($name) { 
    $name = $name . '.php'; 
    if (!file_exists($name) || !is_readable($name)) { 
     // raise an error, throw an exception, return false, it's up to you 
     return false; 
    } 
    require_once $name; 
    return true; 
} 
$loaded = loadScript('childOneScript'); 

В качестве альтернативы вы можете использовать include, PHP будет поднимать только предупреждение, если он не может найти сценарий.

Существует несколько соображений безопасности с вышеуказанной функцией. Например, если пользователю разрешено определять значение $scriptName, злоумышленник может использовать его для чтения любого файла, который читается пользователю веб-сервера.

Вот альтернатива, которая ограничивает количество файлов, которые могут быть динамически загружены только в файлы, которые необходимо загрузить таким образом.

class ScriptLoader { 

    private static $whiteList = array(
     // these files must exist and be readable and should only include 
     // the files that need to be loaded dynamically by your application 
     '/path/to/script1.php' => 1, 
     '/path/to/script2.php' => 1, 
    ); 

    private function __construct() {} 

    public static function load($name) { 
     $name = $name . '.php'; 
     if (isset(self::$whiteList[$name])) { 
      require_once $name; 
      return true; 
     } 
     // the file is not allowed to be loaded dynamically 
     return false; 
    } 
} 

// You can call the static method like so. 
ScriptLoader::load('/path/to/script1');  // returns true 
ScriptLoader::load('/path/to/script2');  // returns true 
ScriptLoader::load('/some/other/phpfile'); // returns false 
+0

@MrPk жаль, что я отклонил ваше редактирование, а затем увидел, почему вы его сделали. Извинения. – robbmj

+0

Я принял это, потому что мне нужно, чтобы он был динамичным. Другие ответы будут работать, но в моем случае мне нужно динамическое решение. – swl1020

+2

Будьте в курсе проблем с безопасностью. Если вы позволите пользователям управлять значением '$ name', это может легко превратиться в утечки. –

1

Просто используйте оператор include внутри условия If.

if $scriptName == "childOne" { 
    include childOneScript.php; 
    } 
2

Вы можете просто сделать:

if ($scriptName=="childOne"){ 
    require_once(childOneScript.php); 
} 

Оператор require_once будет проверить, если файл уже был включен, и если да, не включают в себя (требуется) снова.

Readup:require_once() | PHP

1

Вы можете использовать include или require методы в PHP

<?php 
function loadScript($scriptName) { 
    if ($scriptName=="childOne") { 
    include("childOneScript.php"); 
    } 
} 
?> 

Имейте в виду, однако, что включен скрипт включен, когда вы загрузите его. Таким образом, он находится внутри функции loadScript. Это означает, что вы не можете получить доступ к своему содержимому вне его возможностей.

Смежные вопросы