Область видимости переменной php в oop - PullRequest
2 голосов
/ 13 марта 2010

Интересно, может ли кто-нибудь здесь помочь, я пытаюсь понять, как использовать свойства объектов на нескольких страницах, не относящихся к классу, но я не могу разобраться со всем, что я до сих пор пробовал.

Например, класс с именем person;

class person {
 static $name;     
}

, но у меня есть несколько разных обычных страниц, которые хотят использовать $name по всем направлениям.

Я пробую подобные вещи;

pageone.php

include "person.php";
$names = new Person();

echo person::$name;
names::$name='bob';

pagetwo.php

include "person.php";
echo person::$name;

Я могу работать с классами в той степени, в которой я в порядке, пока я создаю новые экземпляры на каждой странице, но как это сделать?свойства одного объекта доступны всем, например, переменная общего доступа?

Спасибо

Ответы [ 2 ]

3 голосов
/ 13 марта 2010

Каждый новый экземпляр скрипта PHP «забывает» все, что было сделано в предыдущих скриптах. Обычный способ создать «хранилище» для данных при загрузке страниц - сеансы. Сессия - это, по сути, определенный идентификатор, который пользователь получает при посещении страницы. Этот идентификатор хранится в файле cookie или в переменной GET, которая добавляется к каждому URL. PHP хранит текстовые файлы в специальном каталоге, который может содержать специфичные для сеанса данные. Каждый файл назван с использованием идентификатора сеанса.

Руководство по PHP содержит подробное введение здесь.

pageone.php

session_start();
$_SESSION["name"] = "Bob",

pagetwo.php

session_start();

echo $_SESSION["name"];  // Bob

Теперь, если у вас есть экземпляр объекта, вы можете сериализовать его, сохранить в переменной сеанса и отменить его сериализацию обратно на 2-й странице. Я не думаю, что это может быть сделано со статическими классами, хотя. Но это должно быть хорошим началом.

0 голосов
/ 13 марта 2010

Вам нужно инициализировать статическую переменную внутри самого объявления класса:

class Person {
    public static $name = 'bob';
}

Или вам нужен механизм начальной загрузки, где вы инициализируете статическую переменную:

bootstrap.php:

Person::$name = 'bob';

, а затем на страницах:

// assuming, you preloaded the bootstrap somewhere first
$person = new Person();

echo $ person :: $ name;

редактировать
Тьфу, о чем я думал ... вышесказанное даже не сработает. Вы не можете получить доступ к статическому члену, как этот на экземпляре. Только через метод, например так:

class Person
{
    public static $name;

    public function getName()
    {
        return self::$name;
    }

}

// assuming, you preloaded the bootstrap somewhere first
$person = new Person();
echo $person->getName();

/ конец редактирования

Или, как указал Пекка, используйте сеансы для поддержания состояния.

Но что более важно: какую цель вы пытаетесь достичь? Если вы хотите поддерживать состояние объекта Person между различными запросами, то путь Pekka - это путь, или альтернативно используйте другой механизм постоянного хранения, такой как DB, File и т. Д.

Поскольку я предполагаю, что вы не хотите иметь каждый экземпляр Person с именем 'bob', не так ли? Я предполагаю, что вы хотите сохранить состояние одного экземпляра Person.

Итак, в заключение, вы, вероятно, не хотите использовать статический член для начала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...