【问题标题】:Can't open class php in php file with htaccess无法使用 htaccess 在 php 文件中打开类 php
【发布时间】:2013-12-19 02:47:04
【问题描述】:

我想在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]

和 index.php 用于 .htaccess 文件中的规则 (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 时出现错误

警告:需要(../src/App/Login.php):无法打开流:没有这样 C:\xampp\htdocs\mysite\public\login.php 中的文件或目录 线...

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

你能帮帮我吗?

谢谢

【问题讨论】:

    标签: php .htaccess class


    【解决方案1】:

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

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

    因为您从index.php 包含public/login.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 目录是在执行 include 或 require 时首先搜索的目录,因此您可以简单地运行

    require_once 'Login.php';
    

    更新

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

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

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

    $login = new Login();
    

    【讨论】:

    • 哦,是的,这是工作。我真的不知道这个,因为我通常只使用 require 或 include 函数。非常感谢你:)
    • @user1878292 我已经扩展了我的答案
    猜你喜欢
    • 2011-02-06
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 2011-05-16
    • 2021-03-12
    • 1970-01-01
    相关资源
    最近更新 更多