Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从类/函数内部的PHP脚本返回false?_Php - Fatal编程技术网

如何从类/函数内部的PHP脚本返回false?

如何从类/函数内部的PHP脚本返回false?,php,Php,如何从类或函数内部使主PHP脚本返回false 原因:这是因为内置的Web服务器: 如果在web服务器启动时在命令行中给出PHP文件,则将其视为“路由器”脚本。脚本在每个HTTP请求开始时运行如果此脚本返回FALSE,则请求的资源将按原样返回。 从关于 换句话说,在路由器脚本中返回false,以便内置Web服务器可以为静态文件提供服务。文档中的示例: if (preg_match('/\.(?:png|jpg|jpeg|gif)$/', $_SERVER["REQUEST_URI&qu

如何从类或函数内部使主PHP脚本返回
false

原因:这是因为内置的Web服务器:

如果在web服务器启动时在命令行中给出PHP文件,则将其视为“路由器”脚本。脚本在每个HTTP请求开始时运行如果此脚本返回FALSE,则请求的资源将按原样返回。

从关于

换句话说,在路由器脚本中返回
false
,以便内置Web服务器可以为静态文件提供服务。文档中的示例:

if (preg_match('/\.(?:png|jpg|jpeg|gif)$/', $_SERVER["REQUEST_URI"])) {
    return false;    // serve the requested resource as-is.
} else { 
    echo "<p>Welcome</p>";
}
if(预匹配('/\.(?:png | jpg | jpeg | gif)$/',$服务器[“请求URI”])){
return false;//按原样提供请求的资源。
}否则{
回声“欢迎”

”; }
问题是,我正试图将这种行为添加到web框架中:我不想将其写入
index.php
。我宁愿将该逻辑封装到一个类(中间件)中,如果
php\u sapi\u name()

但是,我不知道如何使整个PHP脚本从类或函数返回
false
,因为显然
returnfalse
将从当前方法/函数/文件返回,而不是从主文件返回


例如,有没有办法通过
exit()
实现相同的行为?我意识到我甚至不知道主文件中的
return false
实际上意味着什么(这是一个特定的退出代码吗?)

您应该让路由器调用类方法,然后,如果该方法返回false,则从路由器文件返回false

当然,它会变成头痛。基本上只有两种方法可以实现您想要实现的目标

但是,有一种更快的方法,可以滥用异常并为案例创建专门的异常:

StaticFileException.php

<?php
class StaticFileException extends Exception {}
<?php
try {
    $c = new Controller();
    return $c->handleRequest();
} catch (StaticFileException $e) {
    return false;
}

一旦你有了这种代码,只要
抛出新的StaticFileException
就完成了。

如果类中的方法通过使用
退出
来处理静态资产,那么解决方案可以非常简单,只需将
退出
替换为
返回false
,并让该方法的调用方也简单地在全局范围内返回该方法即可

所以如果你的班级看起来像这样

class Router
{
    public function handleRequest($uri)
    {
        if (is_file($this->docRoot . $uri->path)) {
            exit; // static file found
        } else {
            // handle as normal route
        }
    }
}
$router = new Router($docRoot);
$router->handleRequest($_SERVER['REQUEST_URI']);
只需将那里的
退出
替换为
返回false

            return false; // static file found
然后,如果您的
index.php
工作方式如下

class Router
{
    public function handleRequest($uri)
    {
        if (is_file($this->docRoot . $uri->path)) {
            exit; // static file found
        } else {
            // handle as normal route
        }
    }
}
$router = new Router($docRoot);
$router->handleRequest($_SERVER['REQUEST_URI']);
只需在
handleRequest
方法前面添加一个返回,如下所示

return $router->handleRequest($_SERVER['REQUEST_URI']);
这对框架设计的副作用应该最小,正如您所看到的,只需要很少的代码和重构,因为从脚本的全局范围返回在PHP中只有一个副作用(在这种情况下,它会将值返回给调用脚本,即如果您在赋值中使用
include
/
require
作为表达式)。在您的情况下,如果
index.php
是调用脚本,那么只需在该方法前面添加
return
,您就不用担心了

当然,一旦返回,脚本的其余部分将不会继续,因此请确保它是index.php中的最后一条语句。您甚至可以将返回值赋给一个临时值,然后在需要逻辑时返回

$router = new Router($docRoot);
if ($router->handleRequest($_SERVER['REQUEST_URI'])) {
    /* if you need to do anything else here ... */
} else {
    return false; // otherwise you can return false for static here
}


一般来说,我会说从函数/方法内部调用
exit
几乎是不可取的。这会使类更难测试和调试,而且与抛出异常或仅从方法返回以及让调用方优雅地处理失败场景等备选方案相比,实际上没有任何好处g> .

不可能使用register\u shutdown\u函数或auto\u append\u file设置来处理这个问题吗?不太好,但可能可以完成这项工作。

谢谢你的想法。我正在理想地寻找一种等效的
return false
方法,使用
exit()
或类似的方法(如果可能的话…)。如果不可能的话,恐怕我真的必须研究解决方法:/但是我更愿意让
index.php
尽可能小/简单。我不知道如何将整个路由器文件包装成一个大的try-catch来让它复杂化。顺便说一句:从嵌套上下文跳回的唯一方法是抛出异常。这会使fram变得复杂ework用户。我正在编写一个框架。我希望用户不必关心这个细节(因为他们必须编写和理解
index.php
)。另外
die()
exit()
,等等都是打破嵌套上下文的其他方法。在这种情况下,让他们(告诉他们)编辑另一个文件并使用
index.php
仅处理该逻辑。
die
exit
从开发人员的角度看,它们并没有真正打破嵌套上下文,只是突然终止了脚本。您真正要问的是:php开发人员是否让Web服务器神奇地将特殊的退出代码转换为静态文件资源?答案是否定的。“PHP开发人员是否让Web服务器神奇地将特殊的退出代码转换为静态文件资源?”确切地说:)@Terminus
return false
对PHP的内置服务器有特定的意义,请参阅我引用的文档。这是一个好主意。我只想指出,今天我根本不使用
exit()
。内置服务器不支持静态文件。有一件事让我很难实现,那就是这个框架是基于。由于中间件必须返回
ResponseInterface
对象,因此我不能返回
false
(我希望将“静态文件”功能作为中间件实现,以便正确封装)。不管怎样,这是值得思考的,谢谢。在这种情况下,对投手的建议是一个例外