7

今天我尝试包含返回对象的文件。我总是使用 require_once,但是现在我注意到它的奇怪行为。

文件 main.php

$lang = false;
$lang->name = "eng";
$lang->author = "Misiur";
$lang->text = "Text is test";
$lang->undefined = "Undefined";
return $lang;

文件 index.php

$lang = include('langs/eng/main.php');
var_dump($lang);
echo "<br />";
$lang = require('langs/eng/main.php');
var_dump($lang);
echo "<br />";
$lang = require_once('langs/eng/main.php');
var_dump($lang);

结果

object(stdClass)#9 (4) { ["name"]=>  string(3) "eng" ["author"]=>  string(6) "Misiur" ["text"]=>  string(12) "Text is test" ["undefined"]=>  string(9) "Undefined" }
object(stdClass)#10 (4) { ["name"]=> string(3) "eng" ["author"]=> string(6) "Misiur" ["text"]=> string(12) "Text is test" ["undefined"]=> string(9) "Undefined" }
bool(true) 

为什么会这样?我认为 require 和 require_once 是一回事,只有 require_once 更安全,因为它不会重复包含。

谢谢。

编辑:

但是当我使用require_once 时,我也会得到 bool(true)。所以 require_once 只返回包含的结果,而不是它的内容?

编辑2:

哈哈。我没有注意到,早些时候我在我的类中需要这个文件,它是在代码执行之前创建的 ($this->file = require_once("langs/$name/main.php");)

所以 require_once 可以正常工作。多谢你们!

4

4 回答 4

11

当你使用 include 和 require 时,你会得到你引用的页面被包含的结果。当您使用 require_once 时,它​​会检查并看到页面已经使用 require 加载,因此它返回 true 以告诉您它已在某个时间点成功加载。

于 2010-06-04T14:10:39.407 回答
7

就是这样,您正在尝试复制包含。当您require_once之前没有包含或需要的东西时,您将获得返回值。

编辑:通过 PHP 5.3.2 上的这个简单测试,我require_once在第一次使用时得到了返回值。

父.php:

<?php
$first = require_once("child.php");
var_dump($first);
$second = require_once("child.php");
var_dump($second);
?>

孩子.php:

<?php
return "foo";
?>

它打印:

string(3) "foo"
bool(true)
于 2010-06-04T14:10:42.797 回答
0

我假设您在两个文件上都有打开和关闭标签?include上的 PHP 文档提到了其中的一些内容。查看该页面上的示例#5。

它看起来像include, require,并且require_once都具有相同的功能,只是 require 发出错误而不是警告,并且 require_once 不会重复包含文件。

于 2010-06-04T14:15:38.930 回答
-1

切勿return与包含一起使用。不要返回 anting,也不要分配任何变量。

于 2010-06-04T14:26:35.610 回答