Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: ООП и свойства

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: Разъясните пожалуйста
artsemi
Отправлено: 25 Октября, 2012 - 22:24:16
Post Id


Новичок


Покинул форум
Сообщений всего: 16
Дата рег-ции: Окт. 2012  


Помог: 0 раз(а)




Здравствуйте. В общем такая ситуация...

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2.  
  3. class A {
  4.     private $variable;
  5.  
  6.     public function func() {
  7.         ...
  8.         $variable2 = 4 + 5;
  9.         $this->variable .= $variable2;
  10.         ...
  11.         return что-нибудь
  12.     }
  13. }
  14.  
  15.  


В общем вопрос. В php необязательно объявлять все переменные. Он на это ругаться не будет. (про php.ini знаю). Но по какому принципу объявлять или не объявлять переменные? От каких это факторов зависит? Растерялся
Может я чего-то где-то недочитал, но просмторел много инфы и насчет этого ничего не нашел. Помогите плиз. Хочу начать проект на php (mvc) и без этого ние хочу начинать.
Заранее Спасибо.
 
 Top
Мелкий Супермодератор
Отправлено: 25 Октября, 2012 - 22:31:51
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




artsemi пишет:
Он на это ругаться не будет. (про php.ini знаю).

Вот и выставите E_ALL | E_STRICT и не используйте @.

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


-----
PostgreSQL DBA
 
 Top
artsemi
Отправлено: 25 Октября, 2012 - 22:37:11
Post Id


Новичок


Покинул форум
Сообщений всего: 16
Дата рег-ции: Окт. 2012  


Помог: 0 раз(а)




Нет, ну это понятно. Но вопрос не в этом.
Я хочу узнать почему одну переменную объявляют, а другую нет. Почему $variable объявлена, пусть даже она была бы публичной. это неважно, просто смотрел код многих скриптов и везде так. одна объявлена, а другая нет...
 
 Top
OrmaJever Модератор
Отправлено: 25 Октября, 2012 - 22:37:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




любая операция при которой берётся значение неопределёной(!!) переменой будет выдавать нотис (кроме функций isset и empty).
(Добавление)
artsemi пишет:
Я хочу узнать почему одну переменную объявляют, а другую нет. Почему $variable объявлена, пусть даже она была бы публичной. это неважно, просто смотрел код многих скриптов и везде так. одна объявлена, а другая нет...

Все они обьявлены, просто в другом месте.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
artsemi
Отправлено: 25 Октября, 2012 - 22:40:27
Post Id


Новичок


Покинул форум
Сообщений всего: 16
Дата рег-ции: Окт. 2012  


Помог: 0 раз(а)




Цитата:
Все они обьявлены, просто в другом месте.


Это я знаю. А почему в коде одни переменные стоит объявлять а другие нет???
(Добавление)
Люди ну помогите плиз. Я в таком ступоре что ппц. Чувствую себя совершенно неуверенно из-за этой фигни.
(Добавление)
Может я непонятно объяснил суть проблемы, так вы спросите что именно непонятно, объясню чего конкретно я хочу.
 
 Top
caballero
Отправлено: 25 Октября, 2012 - 22:58:54
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Люди ну помогите плиз. Я в таком ступоре что ппц. Чувствую себя совершенно неуверенно из-за этой фигни.

так не страдай фигней.

сначала определись что ты подразумеваешь под объявлением переменной.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
artsemi
Отправлено: 25 Октября, 2012 - 23:00:41
Post Id


Новичок


Покинул форум
Сообщений всего: 16
Дата рег-ции: Окт. 2012  


Помог: 0 раз(а)




Цитата:
сначала определись что ты подразумеваешь под объявлением переменной.


Определение её как свойства класса. Т.е. при помощи модификаторов доступа private, public, protected

(Отредактировано автором: 25 Октября, 2012 - 23:01:06)

 
 Top
Okula
Отправлено: 25 Октября, 2012 - 23:06:16
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




Так это у тебя и так сделано

По умолчанию будет иметь значение NULL.
Все неописанные свойства будут иметь атрибут public.
 
 Top
artsemi
Отправлено: 25 Октября, 2012 - 23:09:19
Post Id


Новичок


Покинул форум
Сообщений всего: 16
Дата рег-ции: Окт. 2012  


Помог: 0 раз(а)




Okula пишет:
Так это у тебя и так сделано
PHP:
скопировать код в буфер обмена

private $variable;


По умолчанию будет иметь значение NULL.
Все неописанные свойства будут иметь атрибут public.


Люди да я это все понимаю!!! Нежели я так непонятно объяснил чего я хочу...
Я хочу узнать, почему некоторые переменные нужно объявлять именно в коде! (делать их свойствами) а некоторые нет. у меня в примере есть еще вторая переменная которая не объявлена, но я её тоже могу объявить. а могу наоборот. По какому принципу работать? Какие мне объявлять, а какие нет? Как правильно?
(Добавление)
Другими словами если, какие переменные делать свойствами класса, а какие нет.
 
 Top
OrmaJever Модератор
Отправлено: 25 Октября, 2012 - 23:16:13
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




artsemi пишет:
Определение её как свойства класса. Т.е. при помощи модификаторов доступа private, public, protected

Если вы имеете ввиду что-то наподобии этого
PHP:
скопировать код в буфер обмена
  1. class A {}
  2. $a = new A();
  3. $a->v = 1;
  4. echo $a->v;

То так всётаки делать не стоит
1) Таким образом свойство v будет всегда public
2) Если опеределить его в классе то ему можно задать начальное значение, если не задано то в любом случае будет null
3) если вы в выше приведёном коде уберёте строку $a->v = 1 то будет нотис т.к. вы пытаетесь вывести не определёную переменую, а если она будет опеределена в классе то нотиса не будет и выведет просто 0.
4) Это просто удобнее, когда вы смотрите класс вы всегда видите какие свойства у него есть и какой у них уровень доступа.
+5) ещё из за такого обращения неявно вызываются методы __set() и __get() что занимает лишнее время.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Okula
Отправлено: 25 Октября, 2012 - 23:17:25
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




artsemi, почитай про области видимости функций.
 
 Top
Мелкий Супермодератор
Отправлено: 25 Октября, 2012 - 23:17:39
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Резюмируя: вы про
PHP:
скопировать код в буфер обмена
  1. class foo {
  2. public $bar;
  3. public function __construct() {
  4. $this->bar = 'some';
  5. }
  6. }
  7. $o = new foo;
  8. echo $o->bar;

или
PHP:
скопировать код в буфер обмена
  1. class foo {
  2. public function __construct() {
  3. $this->bar = 'some';
  4. }
  5. }
  6. $o = new foo;
  7. echo $o->bar;


Первый вариант предпочтительнее в первую очередь потому, что документирует используемые публичные свойства.
Есть ещё определённые различия работы магических методов (__get, __set срабатывают только на не объявленные свойства), и, на сколько мне известно, во втором случае несколько выше потребление памяти.


-----
PostgreSQL DBA
 
 Top
dubasua
Отправлено: 25 Октября, 2012 - 23:17:48
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




У класса есть магические методы, такие как __construct(); __clone(); и тд.
Вот например __construct(); вызывается автоматом при создании нового объекта, __clone() вызывается автоматом при клонировании объекта, и для переменных тож есть магический метод, я просто не помню как он называется, то есть если переменной(свойства) в классе нет, то при его объявлении класс будет вызывать магический метод, если этого метода нет, ну если он не прописан, будет выполнятся действие по умолчанию.
Это например как при создании нового объекта

Сначала PHP ищет класс с названием "Class_name", если он его не находит, он запускает функцию __autoload($name)(кажется так, точно не помню), которую разработчик может написать сам, а если этой функции нет, только потом он выдает ошибку что класс не найден.
 
 Top
caballero
Отправлено: 25 Октября, 2012 - 23:19:36
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Другими словами если, какие переменные делать свойствами класса, а какие нет.

Какие надо такие и делать.
Если ты пишешь класс ты уже знаешь какие у него должны быть свойства.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
artsemi
Отправлено: 25 Октября, 2012 - 23:19:49
Post Id


Новичок


Покинул форум
Сообщений всего: 16
Дата рег-ции: Окт. 2012  


Помог: 0 раз(а)




Цитата:
Это просто удобнее, когда вы смотрите класс вы всегда видите какие свойства у него есть и какой у них уровень доступа.


А почему тогда все пишут по разному, т.е. я к тому что я не видел еще ни одного скрипта, где все переменные являются свойствами класса.
Всегда есть какие-то "левые" переменные.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB