Включить, требовать и require_once

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

Спасибо.

Редактировать:

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

Edit2:

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

Так что require_once работал как надо. Спасибо, парни!


person Misiur    schedule 04.06.2010    source источник
comment
почему вы вообще используете return? избавиться от этого   -  person Your Common Sense    schedule 04.06.2010
comment
без него у меня нет содержимого объекта $ lang, требуется только результат   -  person Misiur    schedule 04.06.2010
comment
OMG, не будь глупым. просто избавься от отдачи! Не используйте это.   -  person Your Common Sense    schedule 04.06.2010


Ответы (4)


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

person tloach    schedule 04.06.2010

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

РЕДАКТИРОВАТЬ: с помощью этого простого теста на 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)
person Matthew Flaschen    schedule 04.06.2010

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

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

person awshepard    schedule 04.06.2010

Никогда не используйте return с include. Не возвращать anting и не присваивать никакие переменные.

person Your Common Sense    schedule 04.06.2010
comment
Итак, как мне это сделать? Создать внутри него класс, а затем после включения создать объект? Или как? - person Misiur; 04.06.2010
comment
@Misiur, ты можешь делать все, что хочешь. Вам не нужен специальный код для обработки требований. Просто запишите его в один файл, затем вырежьте код, который вы хотите разделить, и вставьте его в другой файл, добавив ‹? php. Это все - person Your Common Sense; 04.06.2010
comment
Было бы полезно объяснить, почему вы считаете это плохой идеей. - person Jarrod Nettles; 04.06.2010