Include_once 在对象中不起作用

Include_once in Object dont work

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

加载数据

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

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

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

event.php:

<?php
include_once(ROOT.'php/db.inc.php');

class Pb1_event
{
    public $ev1_id;
    // do something
}

我也用 include_once('./../db.inc.php'); 试过了。 我应该如何包含它?将它包含在此文件中是一种好方法还是我应该将它包含在其他任何地方?

使用__FILE____DIR__魔术常量:

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

你可以试试这个警告:

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

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

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

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

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

定义一个自动加载函数并让它调用您需要的文件,例如,如果您需要一个名为 DB 的 class,您的函数可能如下所示:

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

我的建议是在脚本的开头使用 spl_autoload_register():

注册一个自动加载器
spl_autoload_register(function ($className) {
    include 'path/to/php/objects/' . $className . '.php';
});

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

$myclass = new MyClass();

自动加载器将加载正确的 class。您需要考虑的只是调用 "objects" 中的文件,就像您的 classes 一样。示例:

class Pb1_event {
}

文件名:path/to/php/objects/Pb1_event.php