2010-06-04 2 views
6

Сегодня я попытался включить файл, который возвращает объект. Я всегда использую require_once, но теперь я заметил странное поведение.Включите, require & 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 более безопасен, потому что он не будет дублировать include.

Спасибо.

Edit:

Но когда я использую только require_once, я получаю логическое значение (истина) тоже. Так require_once возвращает только результат include, а не контент?

Редакция 2:

LOL. Я не заметил, что раньше мне нужен этот файл внутри моего класса, который был создан до этого выполнения кода ($ this-> file = require_once ("langs/$ name/main.php");)

Поэтому require_once работал так, как должен. Спасибо, парни!

+1

Почему вы используете 'return' вообще? избавиться от него –

+0

без него У меня нет объектного объекта $ lang, требуется только результат – Misiur

+0

OMG не глупый. просто избавиться от возвращения! Не используйте его. –

ответ

11

Когда вы используете include и требуете, чтобы вы получили результат страницы, на которую вы ссылаетесь, включены. Когда вы используете require_once, он проверяет и видит, что страница уже загружена с использованием require, поэтому возвращает true, чтобы сообщить вам, что она была успешно загружена в какой-то момент.

7

Это именно то, что вы пытаетесь дублировать. Когда вы require_once что-то, что не было включено или не было раньше, вы получите возвращаемое значение.

EDIT: с помощью этого простого теста на PHP 5.3.2 я получаю возвращаемое значение при использовании require_once в первый раз.

parent.php:

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

child.php:

<?php 
return "foo"; 
?> 

Он печатает:

string(3) "foo" 
bool(true) 
0

Я предполагаю, что у вас есть открытые и закрывающие теги на обоих файлы? В документации PHP на include упоминается часть этого. Пример № 5 на этой странице.

Похоже include, require и require_once имеют одинаковые функциональные возможности, просто требуют выдает ошибку вместо предупреждения, и require_once не дублированных включить файл.

+0

У меня есть открытые/закрытые теги, просто я хотел очистить код. – Misiur

-1

Никогда не используйте return с включением. Не возвращайте привязки и не назначайте какую-либо переменную.

+0

Итак, как я должен это делать? Создайте внутри этого класса, а затем включите create object? Или как? – Misiur

+0

@ Misiur вы можете делать все, что захотите. ** Вам не нужен какой-либо специальный код для обработки. ** Просто напишите его в одном файле, затем вырежьте код, который хотите разделить, и вставьте его в другой файл, перпендикулярный

+2

Может быть полезно объяснить, почему вы думаете, что это плохая идея. –

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