无法用htaccess在php文件中打开类php

时间:2013-12-19 02:47:04

标签: php .htaccess class

我想要包含一个已经创建到php文件的类,这里我使用 .htaccess 。但是一旦放入php文件,php类就无法在php文件中打开或加载。我网站中的以下目录结构。

htdocs/
       mysite/
              src/
                     App/
                     Login.php <-- class file php
              public/
                     login.php <-- file php

这是登录类( mysite / src / App / Login.php

class Login {

     private $username;
     //etc...

} 

这是登录文件( mysite / public / login.php

require('../src/App/Login.php');

$login = new Login();

这是.htaccess文件( mysite / .htaccess

Options +FollowSymLinks
RewriteEngine On

# skip for existing files/directories (/assets will be skipped here)
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

# for public directory
rewritecond %{REQUEST_URI} !^/public/(.*)
RewriteRule .* index.php [L]

和.htaccess文件中的规则的index.php( mysite / index.php

$requested = empty($_SERVER['REQUEST_URI']) ? false : $_SERVER['REQUEST_URI'];
$server_name = str_replace(basename($_SERVER['SCRIPT_NAME']), "", $_SERVER['SCRIPT_NAME']);

switch ($requested) {

    case $server_name:
        include 'public/index.php';
        break;
    case $server_name.'login':
        include 'public/login.php';
        break;
    default:
        include 'public/404.php';
}

但是当我打开 localhost / mysite / login 时出现错误

  

警告:require(../ src / App / Login.php):无法打开流:没有   文件或目录在C:\ xampp \ htdocs \ mysite \ public \ login.php上   线......

     

致命错误:require():无法打开所需的'../src/App/Login.php'   (include_path ='。; C:\ xampp \ php \ PEAR')in   在线上C:\ xampp \ htdocs \ mysite \ public \ login.php ...

你能帮帮我吗?

谢谢

1 个答案:

答案 0 :(得分:1)

通过您尚未配置应用程序级别include_path的相对路径来包含文件的简单规则; 始终基于当前脚本的相对路径,例如

// public/login.php

require_once __DIR__ . '/../src/App/Login.php';

由于您从public/login.php加入index.php包含路径包含index.php的父目录,即mysite。这适用于所有包含的文件。

public/login.php尝试加入../src/App/Login.php时,它实际上是在尝试打开htdocs/mysite/../src/App/Login.php

您可能想要尝试的另一件事是配置应用程序级别包含路径。例如,在index.php ...

set_include_path(implode(PATH_SEPARATOR, [
    __DIR__ . '/src/App',
    get_include_path()
]));

现在,src/App目录是执行includerequire时首次搜索的,因此您只需运行

require_once 'Login.php';

更新

更好的解决方案是注册自动加载器,例如(在index.php中)

spl_autoload_register(function($class) {
    require_once sprintf('%s/src/App/%s.php', __DIR__, $class);
});

然后你可以简单地创建你的课程,而不必担心包含文件......

$login = new Login();