即使在函数内部定义,PHP类总是全局可用吗?

时间:2017-04-28 23:06:03

标签: php class oop

我需要知道,如果一个php类在第一次被声明后总是保证全局可用。

示例:

// in File A:
function check_if_mail() {
    if ( ! empty( $_GET['mail'] ) ) {
        class MyMail {}

        // now I do some require_once() calls to extend the class.
    }
}

// This function is not always executed...
if ( /* some_conditions */ ) {
    check_if_mail();
}


// In File B:
if ( class_exists( 'MyMail' ) ) { // <-- will this work?
    require_once 'template_mail.php';
} else {
    require_once 'template_page.php';
}

“文件A”由我编写,而“文件B”在第三方库中。文件A也很大,本身就是一个类,所以我想尽可能保留函数/条件结构。

➜我需要确保文件B中的条件在PHP 5.6和7.0中正确触发。

2 个答案:

答案 0 :(得分:1)

是否有特定原因要将它放入函数中,因为您无论如何都会立即调用该函数?为什么不直接使用它:

// in File A:
if ( ! empty( $_GET['mail'] ) ) {
    class MyMail {}

    // now I do some require_once() calls to extend the class.
}

// In File B:
if ( class_exists( 'MyMail' ) ) { // <-- will this work?
    require_once 'template_mail.php';
} else {
    require_once 'template_page.php';
}

PHP代码不需要封装在函数中。

编辑:根据您当前的编辑,将类移动到另一个文件,检查您的条件并运行包含可能会更好:

// class-my-mail.php
class MyMail {}

// in File A:
function check_if_mail() {
    if ( ! empty( $_GET['mail'] ) ) {
        require_once 'class-my-mail.php';
    }
}

// This function is not always executed...
if ( /* some_conditions */ ) {
     check_if_mail()
}

虽然这看起来有点......复杂。但简短的回答是'是'。只要在检查它之前包含该类,它在5.6和7中全局可用。虽然不再支持5.6,所以我不知道我会担心多少。

此外,您正在加倍文件A中的条件。您是否需要check_if_email以外的条件?或者甚至在课外?

似乎所有这一切在课堂上都会更好。包括类,将验证放在类函数中并将参数传递给它。这将更加有条理,易于理解和延伸。因为现在你冒着在整个地方改变条件的风险,特别是涉及第三方代码。

答案 1 :(得分:1)

类定义(和函数定义)在PHP中是全局的。它们不是变量;在函数内定义一个函数不会将定义限制在该范围内。