2012-04-10 4 views
1

У меня в мозгу не хватает силы, и с ним мое умение искать (я не нашел 100% ответа на то, что искал). При этом у меня есть класс, внутри которого есть пустая статическая переменная $ title, которую мне нужно определить внутри __construct, но она, похоже, не может получить ее через глобальную. Давайте просто покажем код, не так ли?Как определить статическую переменную внутри __construct с массивом извне класса?

$arg = array(my data is here); 
class Article 
{ 
    static $title; 

    public function __construct() 
    { 
     global $arg; 
     self::$title = $arg['title']; 
    } 

    public static function title() 
    { 
     return self::$title; 
    } 
} 

Моя конечная цель будет просто сделать

echo Article::title(); 

, чтобы получить название статьи. Но, как я уже упоминал, у меня нет такой удачи. Вся помощь приветствуется.

+4

Почему вы хотите в этом поле быть статичным? Почему он не может быть атрибутом обычного класса? Кроме того, почему вы используете 'global', а не просто передаете заголовок конструктору? – Amber

+0

Так что мне не пришлось бы вручную инициализировать. класс каждый раз, когда я его использую. Это лучше для пользователя, если оно остается в виде статьи ::. – Chris

+2

Я не уверен, что вы понимаете использование классов и экземпляров классов. Если вам нужна только одна копия класса, просто создайте один экземпляр класса и используйте его. – Amber

ответ

4

Хотя я согласен с @ комментарии Amber, вы можете делать то, что вы пытаетесь сделать, но вы не можете использовать конструктор для этого, как вы не обязательно экземпляра объекта:

$arg = array(my data is here); 
class Article 
{ 
    static $title; 

    static function set_static() 
    { 
     global $arg; 
     self::$title = $arg['title']; 
    } 

    public static function title() 
    { 
     return self::$title; 
    } 
} 
Article::set_static(); 

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

+0

Ответ @Baba также работал, но был немного раздутым. Ваш, однако, так же хорош, как может (я смело полагаю). В какой-то момент я буду делать что-то по-другому, но, насколько это возможно, это нужно будет сделать. Спасибо. – Chris

+0

@Chris Добро пожаловать. – jeroen

1

Использование Singleton

$arg = array("title"=>" my data is here "); 
class Article 
{ 
    static $title; 
    static $instance = null ; 

    public function __construct() 
    { 
     self::$title = $GLOBALS['arg']['title']; 
    } 

    public static function getInstance() 
    { 
     if(self::$instance === null) 
     { 
      self::$instance = new self(); 
     } 

     return self::$instance; 
    } 
    public static function title() 
    { 
     self::getInstance(); 
     return self::$title; 
    } 
} 


var_dump(Article::title()); //Returns string ' my data is here ' (length=17) 
var_dump(Article::getInstance()->title()); // Returns string ' my data is here ' (length=17) 
0

Вы должны инициализировать его в первую очередь.
Static $ title = ...
Метод --construct вызывается, когда вы новый экземпляр.

0

Я использую статическую функцию, а для неэффективных переменных нагрузок он у меня доступ к закрытым или защищенным членам, а именно:

$arg = array('title' => 'My Title'); 
class Article 
{ 
    static function title() 
    { 
     global $arg; 
     return $arg['title']; 
    } 

    // or if the var load is inefficient ... 
    protected static $title_md5; 
    static function title_md5() 
    { 
     if (!isset(self::$title_md5)) 
      self::$title_md5 = md5(self::title()); 
     return self::$title_md5; 
    } 
} 
echo(
    'title = ' . Article::title() . "\n" . 
    'title_md5 = ' . Article::title_md5() . "\n" 
); 

Выходов:

title = My Title 
title_md5 = 5badc643b79fdda9775c45b46540afc0 
Смежные вопросы