为了账号安全,请及时绑定邮箱和手机立即绑定

包括类中的相对路径变化(奇怪的行为)

包括类中的相对路径变化(奇怪的行为)

PHP
烙印99 2021-12-03 11:03:41
我不想使用自动加载!我有一个get_class包含与当前类相关的文件的方法的类我在类中多次调用该方法(始终是类的相同实例),但有时当前类的相对路径不起作用/更改?看起来很奇怪..如果我把工作目录(CWD)的相对路径像'php/map/app/'.$type.'/'.$name.'.php'它一样总是有效什么可能导致这种情况?该方法是从类的同一个实例和同一个 PHP 进程/请求调用的,所以看起来很奇怪,相对路径有时才有效(它会改变)脚本总是从同一个来源执行 /some-dir/inde.phpprivate function get_class(string $type, string $name): string{    $name = ucfirst($name);    $file = 'map/app/'.$type.'/'.$name.'.php';    if(!include_once $file){        throw new Error('File missing: '.$file);    }    return '\\dbdata\\'.$type.'\\'.$name;}
查看完整描述

3 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

考虑到相对路径,它似乎is_file()并且include_once()不是以相同的方式“工作”。

一切都按预期工作。我正在测试is_file()


查看完整回答
反对 回复 2021-12-03
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

如果您从与包含文件所在的文件夹不同的文件夹中执行此脚本,它将失败。


根据根路径查找文件(在开头添加 /)或使用某种自动加载器。


这可以由 Composer 轻松管理,您的 composer.json 文件将如下所示:


"autoload": {

    "psr-4": {

        "dbdata\\": "map/app/"

    },

    "classmap": [

        "any/additional/classes/to/map"

    ]

}

您需要确保您的 php 文件是命名空间的。然后您还必须vendor/autoload.php在访问任何映射类之前包括


查看完整回答
反对 回复 2021-12-03
?
墨色风雨

TA贡献1853条经验 获得超6个赞

您需要阅读:1)Php 命名空间 2)Php 自动加载类 3)使用命名空间导入类


简单示例(类文件夹/classes/autoload.php):


spl_autoload_register(function($class) {

    // convert namespace to full file path

    $class = 'classes/' . str_replace('\\', '/', $class) . '.php';

    // Load class if exists

    if (file_exists($class)) {

        if (!class_exists($class)) {

            require_once($class);   

        }

    }

});

类示例(classes/Auth/Login/Auth.php):


<?php

// Create namespace

namespace Auth\Login;


// import other class if needed

use Auth\Login\Mysql;


// class sample with or without extends

class Auth extends Mysql

{

     ... class methods here ...

}

?>

然后从命名空间(router.php)加载类:


<?php

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

// Load class 

use Auth\Login\Auth;

try{

    $r = new Auth();

}catch(Exception $e){

    echo '<h4 style="color: #222; font-size: 15px; font-family: Arial">'.$e->getMessage().'<h4>';

}

?>

或者只是从完整路径加载:


require_once($_SERVER['DOCUMENT_ROOT'].'/path-to-class/ClassName.php'); 


查看完整回答
反对 回复 2021-12-03
  • 3 回答
  • 0 关注
  • 168 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号