如何封装文件包括?

时间:2010-09-20 14:01:18

标签: php oop include encapsulation

如果我有一个包含常量的文件的类,那么:

define("FOO", "bar");

有没有办法让类包含带封装的文件,所以如果我在已经定义了FOO常量的地方使用该类,它将不会中断?

3 个答案:

答案 0 :(得分:1)

创建一个静态类,使用常量将是封装特定常量的最佳方法:

static class Constants
{
    const Name = 'foo';
    const Path = 'Bar';
}

然后像这样使用:

echo Constants::Name; //foo
echo Constants::Path; //bar

关于你可以做的预检

function _defined($key,$check_classes = false)
{
    if($check_classes)
    {
        foreach(get_declared_classes() as $class)
        {
            if(constant($class . '::' . $key) !== null)
            {
                return true;
            }
        }
    }
    if(!defined($key)) //global Scope
    {
        return true;
    }
}

用法:

class a
{
    const bar = 'foo';
}

if(_defined('bar',true)) //This would be true because its within a
{
    //Blah
}

如果你想到这样的情况

class a
{
    const b = '?';
}
class b
{
    const b = '?';
}

常量在类范围内,因此它们不会相互影响!

答案 1 :(得分:0)

您可以使用类别

class Foo
{
    constant FOO = 'bar'
}

但是,您必须先包含该类,然后才能将常量与Foo::FOO一起使用。具有常规常量的替代方案是使用前缀为供应商前缀来使冲突不太可能发生,例如,

define('JOHN_FOO', 'bar')

或使用新引入的命名空间(PHP 5.3)

define('JohnIsaacks\FOO', 'bar');

但在所有情况下,我想知道你为什么需要那个。如果要加载类,只需添加autoloader

答案 2 :(得分:0)

您可以使用defined检查是否已定义常量:

<?php
define("FOO", "1");
if (!defined("FOO")) { ## check if constant is not defined yet
    define("FOO", "2");
}
echo FOO;
?>