PHP scandir() 从其他文件调用时不起作用

PHP scandir() don't work when is called from other file

提问人:DaddyGa 提问时间:3/28/2022 最后编辑:Sankalpa WijewickramaDaddyGa 更新时间:3/28/2022 访问量:70

问:

我有问题,当我尝试从使用它的类调用方法不起作用时,witch 意味着它看不到任何目录。scandir()scandir()

这是文件中的方法./Core.php

class Core
{
    public function availableControllers()
    {   
        
        $dir = scandir(__DIR__);
        $count = count($dir);
        $i = 0;
        $availableControllers = array();
        
        while ($i < $count) {
            if (is_dir($dir[$i]) && $dir[$i] !== ".." && $dir[$i] !== ".") {
                array_push($availableControllers, $dir[$i]);
            }
            $i++;
        }
        
        return $availableControllers;
    }

我在(方法使用./Engine/ControllerLoader.phpcontrollerValid()avalibleControllers())

<?php
include  __DIR__ . "/../Core.php";
class ControllerLoader
{
    public function load()
    {
        
        $Core = new Core;
        $URI = ControllerLoader::explodeURI();
        $controller = $Core->controllerValid($URI[0]);
        $object = $Core->objectsValid($controller , $URI[2]);
        
        $controllerFullName = $controller."Controller";
        

        if( ControllerLoader::includeControllerFile() !== false && (isset($URI[1]) && is_int($URI[1])) ) 
        {
           
            ControllerLoader::includeControllerFile();
            call_user_func("$controllerFullName::monitor");            
        }
        elseif( ControllerLoader::includeControllerFile() !== false && $object !== false && (is_int($URI[3]) || !isset($URI[3])) )
        {
            ControllerLoader::includeControllerFile();
            call_user_func("$controller::$object", [$URI[3]]);
        }
        else
        {
            return false;
        }
    }

当我从文件运行方法时工作正常,但是当它 -> 使用它时它不起作用(它返回空数组())。有什么想法吗?avilableControllersCore.phpControllerLoaderload()

php 扫描目录

评论

3赞 CBroe 3/28/2022
__DIR__在第二种情况下,可能没有指向你所期望的位置。
0赞 DaddyGa 3/28/2022
@CBroe当我使用严格的目录时,如“/var/www/path/that/im/pointing/”仍然有效
0赞 CBroe 3/28/2022
那么也许“(方法 controllerValid() use avalibleControllers())”部分中的某些内容是错误的。
0赞 DaddyGa 3/28/2022
@CBroe我发现问题是is_dir()。当我删除 is_dir($dir[$i]) 时一切正常,但我不明白为什么会出现这个问题。

答:

0赞 ikyuchukov 3/28/2022 #1

根据PHP的手册:

__DIR__文件的目录。如果在 include 中使用,则返回包含文件的目录。这相当于 。此目录名称没有尾部斜杠 除非它是根目录。dirname(__FILE__)

https://www.php.net/manual/en/language.constants.magic.php

如果调用了 availableControllers(),则 将是 Core.php 文件的目录。scandir()

您也可以通过使用要使用的方法来检查是否在正确的文件夹中。var_dump(__DIR__)

评论

0赞 DaddyGa 3/28/2022
我发现问题是is_dir()。当我删除 is_dir($dir[$i]) 时一切正常,但我不明白为什么会出现这个问题。
0赞 ikyuchukov 3/28/2022
您希望包含作为文件的控制器,但您正在检查它们是否是目录。由于它们不是目录,因此您的检查失败,
0赞 DaddyGa 3/28/2022
它正在搜索女巫在控制器内部的目录,感谢任何关注。