【问题标题】:PHP: Accessing Variables between included scriptsPHP:在包含的脚本之间访问变量
【发布时间】:2014-12-15 21:18:19
【问题描述】:

如果您在一个脚本中包含多个 PHP 脚本,这些变量是否可以被脚本访问?例如,我有一个名为 post.php 的文件。在这里面我有...

include(email.php);
include(input.php);

这些脚本中的变量是否是自包含的,即使它们“包含”在同一页面上?如果是,我如何在每个脚本中访问它们。我问是因为我不能在“post.php”中调用我在其他脚本中定义的变量。谢谢

使用完整代码进行编辑

这是我从用户那里收集数据的第一页:

<form action="postinput.php" method="post">
<input type="text" placeholder="Name"name="Name"><br>
<input type="text" placeholder="Email"name="Email"><br>

<input type="text" placeholder="Title"name="Title"><br>
<textarea placeholder="Post" rows="4" cols="22" placeholder="Post"name="Post"></textarea>
</form>

这是我获取这些数据并使用 fopen 从提供的数据中创建一个随机“发布”页面的第二页:

$getname = $_POST['Name'];
$getemail = $_POST['Email']; //Here is the email variable I am trying to pass
$gettitle = $_POST['Title'];
$myfile = fopen("$random" . ".php", "w");
$txt = "<?php  include('post.php'); \$email = \"$getemail\";?>" //pass email variable and include post.php
fwrite($myfile, $txt);
print("you can see your post here:");
echo ('http://localhost/' . $random . '.php');

这里是 post.php。这应该包括我在上面传递的 $email 变量,但我什至无法回显该变量。如果我打开生成的 php 页面,我可以看到变量已声明,但由于某种原因我仍然无法访问它。

<?php
include('Header.php');
?>

<div id = "center">
    <form action="" name="emailform" method="post">
        <input type="text" name="name">
        <input type="text" name="email">
        <input type="text" name="message">
        <input type="submit" name="Send" value="Send Email">
    </form>
</div>

<?php

echo $email;

if (isset($_POST['Send'])) {

    $name = $_POST['name'];
    $visitor_email = $_POST['email'];
    $message = $_POST['message'];

    $email_from = 'trustyclient@yoursite.com';
    $email_subject = "You have a reply from better barter";
    $email_body = "Message from: $visitor_email \n \n Message:$message";

    $to = $email;
    $headers = "from:adam\r\n";

    mail($to,$email_subject,$email_body,$headers);

} else {
    echo 'You have not hit the submit button yet';
}
?>

【问题讨论】:

  • 信息不足。包括文件就像复制粘贴其内容一样。它没有什么神秘之处。如果您想知道特定代码在包含后无法正常工作,请提供代码,而不仅仅是您认为无法正常工作的“一般”概念。
  • 在一个脚本中定义并包含的函数和变量在包含文件后的任何时候都可以在包含的任何其他脚本中使用,也包括父脚本。
  • 这些不同的文件之间没有界限,您可以访问同一组资源,无论您在哪个文件中执行此操作。但是,可能还有其他范围可能会导致您的问题:单独的命名空间,或者变量不是全局定义的,而是在函数、类等内部定义的。一般来说,定义全局变量是个好主意,但这可能是问题所在。
  • 是的,如果它们没有在类中私下定义,你可以使用它们。但是如果要在函数内部使用变量,则必须在使用它们之前将它们定义为global。喜欢:global $myvariable;
  • 用完整代码编辑

标签: php variables include


【解决方案1】:

您不需要大括号:include 'email.php';

始终使用包含/要求 include __DIR__ . '/email.php' 的路径。

在包含/要求之后,变量变得可用。

请注意,这可能会覆盖现有变量。

PHP 手册 - include()

当一个文件被包含时,它包含的代码会继承该变量 包含发生的行的范围。任何可用的变量 在调用文件中的该行将在被调用中可用 文件,从那时起。但是,所有函数和类 在包含文件中定义的具有全局范围。


您拥有post.php 并希望访问在email.php 中定义的变量。

电子邮件.php

<?php
$var = 'Hello';

post.php

<?php 
include __DIR__ . '/email.php';
echo $var;

您正在创建一个随机的 php 文件。

$txt = "<?php  include('post.php'); \$email = \"$getemail\";?>"

这部分\$email = \"$getemail\" 对我来说看起来很奇怪。我认为这行应该是:

$txt = "<?php include 'post.php'; $email = '" . $getemail . "'; ?>";

你可以附加 echo $email; 并调用 random.php 来测试它,像这样:

$txt = "<?php include 'post.php'; $email = '" . $getemail . "'; echo $email; ?>";

顺便说一句:这是一种模板方法。您正在插入内容以生成新文件。

【讨论】:

  • 为什么会有反斜杠?
  • 因为它们是用于目录分离的。但您可能会使用常量 DIRECTORY_SEPARATOR - 这可能更干净且跨平台。
  • 我的意思是只有 windows 才能理解这些反斜杠。最好确实使用 DIRECTORY_SEPARATOR 或只是旧的 /
  • 用完整代码编辑。您的帖子很有帮助,但似乎所有内容都已正确包含,因为我可以看到包含的 php 脚本中的其他元素。问题是我无法访问变量
  • 我会看看并扩展我的答案。
【解决方案2】:

Variables operate in 3 scopes全局函数对象/类。无论变量在哪个作用域中,都不受includeinclude_oncerequirerequire_once 的影响。

全局

全局变量只能在函数和类$GLOBALSsuperglobal之外访问。但是,变量不受namespaces 的影响。

功能

函数内部使用的变量仅对该函数可用,并在函数运行后重置。请记住,static 变量不会在函数运行后重置。此外,虽然变量不受包含或要求的影响,但如果您在函数内部使用包含/要求,则包含的文件及其变量都在该函数的范围内。

对象/类

实例化对象或类中使用的变量(例如stdClass)对于该实例是唯一的。而静态类只有一个变量的全局实例。需要注意的是,当它们在对象中使用时,您必须通过正确的命名空间访问对象(以及代理变量),如下所示:

实例化

$helloWorld = \myNamespace\helloWorld();
echo $helloWorld->myVar

静态

echo \myNamespace\helloWorld::$myVar

【讨论】:

  • 第四个作用域是全局的。
  • @JonathanKuhn 我知道,从技术上讲,“全局”是一个名称空间。给我一点时间把剩下的写进去。
【解决方案3】:

如果您设置了变量并且它们是唯一的,您可以从包含脚本的位置访问它们!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    相关资源
    最近更新 更多