Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.79/97: Рейтинг темы: голосов - 97, средняя оценка - 4.79
БТР - мой друг
 Аватар для Hagrael
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932

self, static, var, public

05.08.2010, 15:34. Показов 20150. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не понимаю ничего в этих приставках... Зачем делать static-переменные? Чем отличается var от public?
Стоп... static-переменные нужны для того, чтобы во время создания объекта произошла инициализация типа
PHP
1
$this->a=self::$b+1;
Всё равно толком ничё не понял. Зачем делать static, когда можно сделать var???
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.08.2010, 15:34
Ответы с готовыми решениями:

Как сцепить строки? Например <? $var='Ура!'; $var=$var+' Еще раз...'; echo $var; ?>
Вот пример: &lt;? $var='Ура!'; $var=$var+' Еще раз...'; echo $var; ?&gt; Выводит Ура!0

Скрипты перестали различать $_POST['var'], $_SESSION['var'] и просто $var
После переезда на новый хостинг с php 5.2 на php 5.3 обнаружил глюк. Почему то скрипты перестали различать $_POST, $_SESSION и просто...

Global $var или $GLOBALS['var']
Здравствуйте! Такие вот два примера: function assoc($sql, $array = ) { global $pdo; $sql = $pdo-&gt;prepare($sql);...

25
 Аватар для AK3RN
307 / 20 / 4
Регистрация: 01.05.2010
Сообщений: 250
05.08.2010, 15:38
Под static-переменную память выделяется единожды при запуске программы и освобождается в конце(при завершении программы), т.е. объявляя такую переменную мы можем сохранить ее значение при множественных вызовах функции, в которой она объявлена.

public-данные доступны за пределами класса, а не только для методов класса. Подробнее в гугле
0
БТР - мой друг
 Аватар для Hagrael
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
05.08.2010, 15:44  [ТС]
Тоесть когда создаётся объект, только тогда создаётся static-переменная, да? Но ведь мы можем получить к ней доступ через self значит она есть. А в чём разница между var и public. Можно обойтись ведь без static, Как мне кажется.
0
 Аватар для ostgals
886 / 681 / 101
Регистрация: 23.01.2009
Сообщений: 1,582
05.08.2010, 15:49
static-члены класса доступны даже если объект этого класса не создан:

PHP
1
2
3
4
5
6
7
8
class A {
    public static $static_item = 'hello';
    public static function hello() {
        echo 'hello_function';
    }
}
echo A::$static_item; // выведет hello, хотя объекты класса A не создавались.
A::hello(); // выведет hello_function
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
05.08.2010, 15:51
Буквально сегодня FAQ поспел
1
БТР - мой друг
 Аватар для Hagrael
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
05.08.2010, 16:02  [ТС]
Vovan-VE, просматриваю.

Добавлено через 1 минуту
ostgals, это нужно для того, чтобы не создавая объект, ты имел доступ к этой переменной? А если и public, и static, то оба варианта (::, ->) будут доступны?

Добавлено через 3 минуты
Кто-нибудь может привести простой пример, где статические данные реально нужны?
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
05.08.2010, 16:07
Цитата Сообщение от Hagrael Посмотреть сообщение
Кто-нибудь может привести простой пример, где статические данные реально нужны?
Счетчик объектов: сколько экземпляров класса существует:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class A {
    protected static $InstanceCounter = 0;
    public function __construct() {
        self::$InstanceCounter++;
        echo '+A' . PHP_EOL;
    }
    public function __destruct() {
        echo '-A' . PHP_EOL;
        self::$InstanceCounter--;
    }
}
 
echo A::$InstanceCounter . PHP_EOL; // 0
$a = new A();
echo A::$InstanceCounter . PHP_EOL; // 1
$b = new A();
echo A::$InstanceCounter . PHP_EOL; // 2
unset($a);
echo A::$InstanceCounter . PHP_EOL; // 1
unset($b);
echo A::$InstanceCounter . PHP_EOL; // 0
0
БТР - мой друг
 Аватар для Hagrael
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
05.08.2010, 16:26  [ТС]
Vovan-VE, ясно... Это для того, чтобы именно работать с классами, а с объектами надо работать public'ами, так?
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
05.08.2010, 16:29
Да, как-то так. У экземпляров класса есть свойства и методы. А статические свойства и методы присущи самому классу, а не его экземплярам.
1
БТР - мой друг
 Аватар для Hagrael
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
05.08.2010, 16:51  [ТС]
Vovan-VE, ясно. Спасибо.

Добавлено через 11 минут
Но смотри: вот допустим счётчик объектов. Вот к примеру код:
PHP
1
2
3
4
5
6
7
class Class1 {
  function __construct() {
    self::count=self::count+1;
    $this->count=self::count;
    echo $this->count;
  }
}
И эта функция, как я полагаю, будет писать кол-во объектов (объект будет писать свой номер). Всё правильно?
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
05.08.2010, 16:58
Hagrael, Теоритически правильно. Фактически есть три ошибки. 1: Статический и обычный count надо обозвать по-разному. 2: Не декларированы ни тот, ни другой. 3: Статические свойства надо писать ClassName::$StaticVar.
0
#define книжный_червь Я
 Аватар для ][акер
185 / 96 / 21
Регистрация: 30.01.2010
Сообщений: 780
05.08.2010, 18:38
Я не знаю как там в PHP статистические переменные ведут себя в классе, но в C++ статистические переменные в классе - это переменные, которые всегда имеют одно значение не зависимо от объекста. Т.е. давайте (на C++) напишем программу, которая считает сколько объектов создано:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
class count {
public:
static int i;
count() { i++; } // Я немножко забыл как делать конструкторы, но вроде так...
};
int main()
{
    count a,b,c,d;
    cout << "Объявлено " << count::i << " объектов.\n";
    count e,f;
    cout << "Объявлено " << count::i << " объектов.\n";
    return 0;
}
Андерстенд?
0
БТР - мой друг
 Аватар для Hagrael
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
05.08.2010, 19:17  [ТС]
][акер, ну видимо в PHP по-другому.
Vovan-VE, так надо писать
PHP
1
ClassName::$count;
? А статической она автоматически сделается или надо указать static? А нельзя объявить переменную
PHP
1
$this->variable
? Вот этот код правилен? :
PHP
1
2
3
4
5
6
7
8
9
class CL {
    static $count; // Тогда я полагаю её и так можно будет вызвать через ::
    public $objcount; // Это переменная объекта
    function __construct {
        self::count=self::count+1;
        $this->objcount=self::count;
        echo $this->objcount;
    }
}
А нельзя использовать такой код:
PHP
1
2
3
4
5
6
7
8
9
class CL {
    static $count; // Тогда я полагаю её и так можно будет вызвать через ::
    public $objcount; // Это переменная объекта
    function __construct {
        static $count=static $count+1;
        public $objcount=static $count;
        echo $this->objcount;
    }
}
Блин, а. Пожалуйста, приведите нетрудный пример... ещё раз. Да, да, вот такой вот я непонятливый... Заранее благодарен.
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
05.08.2010, 19:34
Hagrael, Надо читать литературу об ООП в принципе, ибо сложно и долго объяснять.
0
БТР - мой друг
 Аватар для Hagrael
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
06.08.2010, 06:08  [ТС]
Vovan-VE, я буду продолжать читать материал на php.su, но всё равно прошу помочь (но если не поможешь, то разумеется, я пойму, я б и сам навряд ли стал себе столько долго вдалбливать =) )

Добавлено через 10 часов 21 минуту
Ну как бы кажется я понял, public - для объектных переменных, static - для переменных класса.
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
06.08.2010, 07:05
Hagrael, public, protected и private - это видимость. static - это модификатор статичности.
PHP
1
2
3
4
5
6
7
8
9
10
class A {
    public $a;
    protected $b;
    private $c;
 
    static $d1; // то же, что public static
    public static $d2;
    protected static $e;
    private static $f;
}
1
БТР - мой друг
 Аватар для Hagrael
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
06.08.2010, 08:47  [ТС]
Цитата Сообщение от Vovan-VE Посмотреть сообщение
Hagrael, public, protected и private
Hagrael - это тоже приставка?
Кое-что уже проясняется. Значит, public, private, protected (кст., а var тоже ведь к этому относится, да?) - это одна группа (отвечающая за область видимости), а static - это как бы опция, которую можно ещё дополнительно включить. Щас ещё раз просмотрю коды и попробую понять, для чего нужен static. Кст., то есть если у меня private $a, то вызвать её через $obj->a я не могу, так?
Но ты говорил, что
Цитата Сообщение от Vovan-VE Посмотреть сообщение
Статические свойства надо писать ClassName::$StaticVar
Этого я не понял. Их так надо объявлять или возюкаться с ними так надо?

Добавлено через 32 минуты
Хм... не очень понял вот тот твой код:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class A {
    protected static $InstanceCounter = 0;
    public function __construct() {
        self::$InstanceCounter++;
        echo '+A' . PHP_EOL;
    }
    public function __destruct() {
        echo '-A' . PHP_EOL;
        self::$InstanceCounter--;
    }
}
 
echo A::$InstanceCounter . PHP_EOL; // 0
$a = new A();
echo A::$InstanceCounter . PHP_EOL; // 1
$b = new A();
echo A::$InstanceCounter . PHP_EOL; // 2
unset($a);
echo A::$InstanceCounter . PHP_EOL; // 1
unset($b);
echo A::$InstanceCounter . PHP_EOL; // 0
Значит, static - это переменная, относящаяся к классу, так? Она появляется, только когда создаётся объект или нет? Для чего вообще её писать, если можно написать protected... Стоп. Если я напишу просто protected, то переменная будет относится к данному объекту (и вызвана только из него и из его потомков, и ко всем остальным объектам данного класса это не будет иметь никакого отношения), а если напишу protected static, то это свойство класса можно будет вызывать только из самого класса и из его наследников, так? А var - это чтобы данная переменная была видима только в данном блоке программы ({}) и как я понял в его подблоках. Я всё правильно понял? Достук к переменным класса такой: ClassName::$variable, а достук к переменным объекта такой: $ObjectName->Variable. Кажется я разобрался!!!

Добавлено через 56 секунд
Кст., и код твой теперь я понял! СПАСИБО, Vovan-VE!!!!!!!!!!!!!!!!!!!!!!!!!
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
06.08.2010, 10:09
var - это устаревший способ из PHP4, использовать не следует (PHP4 - это вообще отдельная история). В PHP5 var трактуется как public.
2
БТР - мой друг
 Аватар для Hagrael
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
06.08.2010, 10:44  [ТС]
Vovan-VE, понял. Знач, в PHP var щас не юзается.
0
 Аватар для Faba
90 / 88 / 17
Регистрация: 30.10.2009
Сообщений: 562
06.08.2010, 10:47
почему бы просто не почитать какую-нибудь хорошую книгу ООП? много вопросов бы отпало сразу
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.08.2010, 10:47
Помогаю со студенческими работами здесь

В чем разница между $var и $$var?
Обясните плиз новичку разницу между $var и $$var Thanx!

как исправить ошибку Warning: The magic method __toString() must have public visibility and cannot be static
&lt;?php error_reporting(E_ALL &amp; ~E_NOTICE); class employee { public function __construct($surname, $name,...

Можно ли выполнить условие $var===false, если переменная $var другого типа (не boolean)?
Сокет-сервер, использующий скрипт на PHP под Linux, разрывает соединение со стороны сервера, если для данных $input, полученных с клиента,...

Вызов public метода public класса внутри static метода static класса
Подскажите, пожалуйста, возможен вызов не статического метода не статического класса внутри статического метода статического класса? ...

Static public и public static
В чем разница?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru