Как инкапсулировать файл include? - PullRequest
0 голосов
/ 20 сентября 2010

Если у меня есть класс, который включает в себя файл с константой, например, так:

define("FOO", "bar");

Можно ли сделать так, чтобы класс включал файл с инкапсуляцией, поэтому, если я использую класс где-то, у которого уже естьFOO константа определена, что она не сломается?

Ответы [ 3 ]

1 голос
/ 20 сентября 2010

Создание статического класса и использование констант будет лучшим способом для инкапсуляции определенных констант:

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 = '?';
}

константы находятся в области видимости класса, поэтому они не будут влиять друг на друга!

0 голосов
/ 20 сентября 2010

Вы можете проверить, если константа уже определена, используя defined:

<?php
define("FOO", "1");
if (!defined("FOO")) { ## check if constant is not defined yet
    define("FOO", "2");
}
echo FOO;
?>
0 голосов
/ 20 сентября 2010

Вы можете использовать класс класса

class Foo
{
    constant FOO = 'bar'
}

Однако вам нужно будет включить класс, прежде чем вы сможете использовать константу с Foo::FOO. Альтернатива с обычными константами состоит в том, чтобы использовать для префикса их префикс поставщика, чтобы снизить вероятность конфликтов, например

define('JOHN_FOO', 'bar')

или используйте недавно введенные пространства имен (PHP 5.3)

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

Но во всех случаях мне интересно, зачем вам это нужно. Если вы хотите загрузить классы, просто добавьте автозагрузчик .

...