警告:require_once(./mailer/class.phpmailer.php):打开流失败:

Posted

技术标签:

【中文标题】警告:require_once(./mailer/class.phpmailer.php):打开流失败:【英文标题】:Warning: require_once(./mailer/class.phpmailer.php): failed to open stream: 【发布时间】:2019-12-08 17:17:21 【问题描述】:

树:

--myproject
----mailer
-------class.phpmailer.php
----test
-------index.php
----site.php
----class.php
----db.php
----index.php

index.php:(两者)

<?php 
require_once '../site.php';
?>

site.php:

<?php
require_once "class.php";
?>

class.php

<?php
require_once 'db.php';
require_once('./mailer/class.phpmailer.php');
?>

当我访问测试时,它显示:

警告:require_once(./mailer/class.phpmailer.php):打开失败 流:C:\wamp\www\myproject\class.php 中没有这样的文件或目录 在第 3 行


致命错误:require_once(): 未能打开所需的 './mailer/class.phpmailer.php' (include_path='.;C:\php\pear') in C:\wamp\www\myproject\class.php 在第 3 行


我也试过include_once,但同样的错误!

【问题讨论】:

首先,如果site.php和index.php都在同一个目录下,你为什么要require_once '../site.php'; 【参考方案1】:

使用$_SERVER['DOCUMENT_ROOT'] 并包含完整路径。

例如,您可以在两个 index.php 文件上执行以下操作:

require_once($_SERVER['DOCUMENT_ROOT'].'/site.php');

还有site.php

require_once($_SERVER['DOCUMENT_ROOT'].'/class.php');

还有class.php

require_once($_SERVER['DOCUMENT_ROOT'].'/db.php');
require_once($_SERVER['DOCUMENT_ROOT'].'/mailer/class.phpmailer.php');

原因是什么?因为$_SERVER['DOCUMENT_ROOT'] 会动态地将服务器上的完整文件路径返回给文档根目录。这就像说(假设你的文档根是/www/username/public_html):

require_once('/www/username/public_html/db.php');

这将始终相同 - 直到您更改到新的目录位置或服务器。发生这种情况时,不必重写每个require_once(),因为您使用了$_SERVER['DOCUMENT_ROOT'],PHP 将为您完成这项工作。

与绝对路径相比,使用相对路径可能会令人困惑,因为它是相对于当前位置的。

【讨论】:

【参考方案2】:

让我试着回答这个问题。

在文件夹 test 下的 index.php 文件中,您可以使用如下代码:

<?php 
require_once '../site.php';
?>

在 site.php 上你可以使用如下代码:

<?php
require_once "class.php";
?>

在class.php上你可以添加如下代码:

<?php
require_once 'db.php';
require_once('mailer/class.phpmailer.php');
?>

在文件夹 myproject 根目录的 index.php 文件中,您可以使用如下代码:

<?php 
require_once 'site.php';
?>

希望这个技巧可以帮到你。

【讨论】:

【参考方案3】:

你打电话给

require_once('./mailer/class.phpmailer.php');

从index.php里面,所以文件在上面两层。

改变

require_once('./mailer/class.phpmailer.php');

require_once('../mailer/class.phpmailer.php');

更新

刚刚意识到您需要两个 index.php 文件都可以工作。这不是最漂亮的解决方案,但您可以这样做:

/test/index.php

<?php

$nested = true;
require_once '../site.php';

?>

/index.php

<?php 

$nested = false;
require_once 'site.php';

?>

这个新的“嵌套”变量将确定文件是在目录内还是在基础上。

编辑您的 class.php 使其如下所示:

<?php

require_once 'db.php';

if ($nested == true)
require_once('../mailer/class.phpmailer.php');

elseif ($nested == false)
require_once('./mailer/class.phpmailer.php');

?>

这应该可以解决两个文件中的问题。

【讨论】:

@tusa 检查我的更新,这应该可以解决您的问题。

以上是关于警告:require_once(./mailer/class.phpmailer.php):打开流失败:的主要内容,如果未能解决你的问题,请参考以下文章

调用 require_once() 的警告和致命错误

警告:require_once():在 PHP 中依赖系统的时区设置错误是不安全的

magento - 警告:require_once(app/Mage.php):无法打开流:没有这样的文件或目录

我 && yii2(日志埋点,邮件提醒)

警告:require_once(): http:// wrapper 在服务器配置中被 allow_url_include=0 禁用

警告:require_once(Composer/PHPMailer/vendor/phpmailer/phpmailer/src/autoload.php):无法打开流:没有这样的文件或目录