对象中的Include_once不起作用


Include_once in Object dont work

我遇到了php和OOP的问题
我试图创建一个对象,并在对象内部尝试从mysql加载数据。

我的文件是这样构建的
HTML
|_php
|__对象
|_内容

对象文件夹中是对象文件"Event"。在php文件夹中的脚本中创建的对象和整个脚本都是从内容中的html文件中调用的。

我的问题是,我从不同的位置使用对象。include_one方法不起作用。

event.php:

<?php
include_once(ROOT.'php/db.inc.php');
class Pb1_event
{
    public $ev1_id;
    // do something
}

我还用includeonce('./../db.inc.php);进行了尝试;。我应该如何包括它?将它包含在这个文件中是一个好方法,还是应该将它包含到其他任何地方?

首先,我要做的是使用__DIR__或更好的$_SERVER['DOCUMENT_ROOT']进行绝对路径。这些常量将引用您的服务器web根目录。假设它指的是你给我们的根目录,你会这样做:

require_once $_SERVER['DOCUMENT_ROOT'] . '/php/db.inc.php';

但为了更好地理解,您应该echo它,并查看您的目录路径。此外,对于应该使用自动加载的"最佳实践",您可以在这里阅读更多信息:

http://php.net/manual/en/language.oop5.autoload.php

定义一个自动加载函数并让它调用你需要的文件,例如,如果你需要一个名为DB的类,你的函数可能看起来像这样:

function __autoload($class) {
    if ($class == 'DB') {
        require_once $_SERVER['DOCUMENT_ROOT'] . '/php/db.inc.php';
    }
}

使用__FILE____DIR__魔术常数:

include_once(dirname(__FILE__) . '/../db.inc.php');
include_once(__DIR__ . '/../db.inc.php');

我的建议是在脚本的开头使用spl_autoload_register():注册一个自动加载器

spl_autoload_register(function ($className) {
    include 'path/to/php/objects/' . $className . '.php';
});

当你想实例化一个对象时,无论你在哪里,你只需要做:

$myclass = new MyClass();

自动加载器将加载正确的类。您所需要考虑的就是像调用类一样调用"对象"中的文件。示例:

class Pb1_event {
}

filename:路径/to/php/objects/Pb1_event.php

您可以尝试以下警告:

include_once($_SERVER["DOCUMENT_ROOT"].'/php/db.inc.php');