如何提高可读性? (将php vars传递给外部文件中的javascript)

时间:2013-11-08 21:47:03

标签: javascript php variables

我有以下代码:

<HTML>
    <?php
        if(isset($_GET['adjust'])){
            $adjust = true;
        }
        //More variabele declaring
    ?>
    <HEAD>
        <script type="text/javascript">
            var adjust = "<?php Print($adjust); ?>";
            //More variable 'transports'
        </script>
    </HEAD>
<!-- rest of the file -->

我想稍微清理一下,因为我有很多变量。这会损害文件的可读性和概述。

我想把它全部放到外部JavaScript文件中,但似乎没有用。

<HTML>
    <?php
        if(isset($_GET['adjust'])){
            $adjust = true;
        }
        //More variabele declaring
    ?>
    <HEAD>
        <script type="text/javascript" src="externalJS.js"></script>
    </HEAD>
<!-- rest of the file -->

使用externalJS.js:

var adjust = "<?php Print($adjust); ?>";
//More variable 'transports'

根据this question,此处也有关于stackoverflow的问题,这是不可能的。

有没有办法用过去几年的知识来做到这一点,因为上面的问题得到了回答? 还有其他方法可以提高可读性吗?

P.S。:我认为值得一提的是我从url,txt文件和cookie中获取了我的php变量。

3 个答案:

答案 0 :(得分:5)

当我遇到需要将大量变量放入javascript的情况时,我使用了将所有这些项加载到对象(或数组)中并将该数据输出到javascript中的对象/数组文字的方法

例如:

<?php
$js_object = new stdClass();
$js_object->foo = 'some value';
$js_object->bar = 'some other value';
?>
<script type="text/javacript">;
var php_values = <?php echo json_encode($js_object); ?>;
console.log(php_values.foo);
console.log(php_values.bar);
</script>

这做了一些事情。

  1. 如果传递的变量需要更改,则您的JS输出部分根本不需要更改。在通过$js_object
  2. 将对象输出到浏览器之前,只需要在json_encode()中加载要在JS中访问的任何内容
  3. 它将所有PHP提供的值放在javascript中的整洁对象/数组中,以便访问它们。
  4. 您可以轻松地以这种方式传递复杂的数据结构(嵌套数组,包含数组的对象,对象数组等)。
  5. 如果需要,您可以在javascript中扩展对象,以提供处理数据的方法等。
  6. 我还会评论您可能想要想一想是否要以这种方式传递cookie数据。无论如何,javascript都可以使用Cookie数据,因此如果您需要更改值等,可能需要直接使用该数据。

答案 1 :(得分:0)

在PHP中创建一个包含变量名称的数组(在javascript中你想要它)作为每个元素的键,以及你在javascript中想要的值作为每个元素的值。然后,按照:

$myVars = array();
$myVars['adjust'] = isset($_POST['adjust']) ? true : false;
$myVars['other'] = isset($_POST['other']) ? true : false;
$myVars['another'] = isset($_POST['another']) ? true : false;

<script type="text/javascript">
    <?php
    foreach( $myVars as $k => $v ):
         echo 'var ' . $k . '="' . $v . '";'; 
    ?>
</script>

干杯

答案 2 :(得分:0)

Mike Brant的方法在这里很好(将所有内容存储在json对象中),但要以更加分段的方式完成您在此处所要求的内容,您可以简单地将包含的javascript库作为输出Javascript的PHP文件头。你的标记看起来像这样:

<HTML>
    <?php
        if(isset($_GET['adjust'])){
            $adjust = true;
        }
        //More variabele declaring
    ?>
    <HEAD>
        <script type="text/javascript" src="externalJS.js.php?<?=http_build_query($_GET);?>"></script>
    </HEAD>
<!-- rest of the file -->

然后你的externalJS.js.php文件看起来像:

<?php
header("content-type: text/javascript");
?>
var adjust = "<?php Print($adjust); ?>";
//More variable 'transports' and any other PHP/Javascript code

这里header告诉浏览器尽管扩展名为.php,但仍将结果视为javascript。

另外,如果你真的想要,你也可以告诉你webserver将js文件解析为PHP,这样它就可以查找<?php ... ?>段并执行它们,所以你甚至都不会需要在文件上有一个非js扩展名:

AddType application/x-httpd-php .js

但是在执行此操作时要小心,因为这意味着将解析所有javascript文件(或指定目录中的任何文件,如果您使用htaccess),这可能会打开安全漏洞不小心。


几个旁注:

  1. 查看the discussion around text/javascript vs application/javascript
  2. 不要大写所有标记名称。是的,HTML5表示没关系,但W3C建议将小写作为惯例(标准化和任何可能的转换为xhtml)。
  3. 当只是printecho时,首先使用小写(print vs Print),不要将打印变量包装在括号中( printecho是语言结构,因此它们不需要括号,并且在某些情况下使用它们会导致问题),最后,如果你在PHP标签中所做的只是打印或回声,尝试使用PHP echo简写(大多数网络服务器默认理解它们):<?=$var_name;?><?php print($var_name);?>相同