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 »   

> Без описания
zzzzzz
Отправлено: 29 Апреля, 2014 - 17:25:57
Post Id


Гость


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


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




Здравствуйте. Чет я туплю
PHP:
скопировать код в буфер обмена
  1.  
  2. class MyClass {
  3.        
  4.                 var $mysqli;
  5.                
  6.                 function __construct( $mysqli ){
  7.                         $this->$mysqli = $mysqli;
  8.                 }
  9.                
  10.                 function met1(){
  11.                         print $this->mysqli;
  12.                 }
  13.                
  14.                 function met2(){
  15.                         print 2;
  16.                 }
  17.         }
  18.        
  19.         $myClass = new MyClass;
  20.         $myClass->met2();
  21.  


Ошибка Missing argument...

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


Где я повернул не туда?
 
 Top
Ch_chov
Отправлено: 29 Апреля, 2014 - 17:29:13
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


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




Наверно все таки аргумент требуется при создании объекта, а не при вызове метода.
И что значит "не обязательный вызов конструктора"?
 
 Top
zzzzzz
Отправлено: 29 Апреля, 2014 - 17:39:56
Post Id


Гость


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


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




Ошибся, при создании объекта, мне нечего передать, ведь вызываемый метод ниже не использует свойство mysqli

Как код сделать рабочим?
 
 Top
Ch_chov
Отправлено: 29 Апреля, 2014 - 17:49:42
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


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




Сделайте met2 статическим методом класса
 
 Top
OrmaJever Модератор
Отправлено: 29 Апреля, 2014 - 17:50:53
Post Id



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


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


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




zzzzzz пишет:
ведь вызываемый метод ниже не использует свойство mysqli

И что? Вы написали что конструктор должен получить параметр, значит должен, причём тут другие методы, не пойму Растерялся
zzzzzz пишет:
Как код сделать рабочим?

PHP:
скопировать код в буфер обмена
  1. $myClass = new MyClass($mysqliVar);
  2. $myClass->met2();


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
zzzzzz
Отправлено: 29 Апреля, 2014 - 21:16:30
Post Id


Гость


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


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




Конструктор должен принимать параметр и выполняться если при создании объекта я передаю параметр new MyClass( $mysqliVar ) , но если делаю так new MyClass; то конструктор как бы должен идти лесом

Это в идеале )

Но участвует он всегда, поэтому и задаю вопрос, как делаете вы ).

Сейчас реализовано так
и Правильно?
 
 Top
IllusionMH
Отправлено: 29 Апреля, 2014 - 21:21:20
Post Id



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


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


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




zzzzzz пишет:
но если делаю так new MyClass; то конструктор как бы должен идти лесом

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

Реализуется через статический метод, как уже и сделано.
 
 Top
zzzzzz
Отправлено: 29 Апреля, 2014 - 21:22:56
Post Id


Гость


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


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




Думаю статистические методы как раз для этих целей были введены
 
 Top
Stierus Супермодератор
Отправлено: 29 Апреля, 2014 - 21:37:35
Post Id



Рекордсмен по количеству сообщений за 7 дней


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


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




PHP:
скопировать код в буфер обмена
  1.  
  2. class MyClass {
  3.        
  4.                 var $mysqli;
  5.                
  6.                 function __construct( $mysqli=null ){
  7.                         $this->$mysqli = $mysqli;
  8.                 }
  9.                
  10.                 function met1(){
  11.                         print $this->mysqli;
  12.                 }
  13.                
  14.                 function met2(){
  15.                         print 2;
  16.                 }
  17.         }
  18.        
  19.         $myClass = new MyClass;
  20.         $myClass->met2();
  21.  
 
My status
 Top
teddy
Отправлено: 29 Апреля, 2014 - 22:02:36
Post Id


Участник


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


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




zzzzzz пишет:
Конструктор должен принимать параметр и выполняться если при создании объекта я передаю параметр new MyClass( $mysqliVar ) , но если делаю так new MyClass; то конструктор как бы должен идти лесом

Прежде чем говорить такое неплохо бы почитать соответствующую документацию

Если надо по каким либо причинам получить экземпляр класса но при этом что бы конструктор "пошел лесом", то вот пример:

PHP:
скопировать код в буфер обмена
  1. class Example{
  2.        
  3.     public function __construct(){
  4.         echo 'Я НЕ ВЫЗВАЛСЯ';
  5.     }
  6.        
  7.     public function sayHello($name){
  8.         return 'Hello, '.$name;
  9.     }
  10.  
  11. }
  12.  
  13. $rc = new ReflectionClass('Example');
  14. $example = $rc->newInstanceWithoutConstructor();
  15. var_dump($example);//object(Example)
  16. echo $example->sayHello('Mike');//Hello, Mike

(Добавление)
P:S - var устарело.

полезная ссылка: http://www.php.net/manual/ru/language.oop5.php
 
 Top
zzzzzz
Отправлено: 29 Апреля, 2014 - 22:43:41
Post Id


Гость


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


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




Stierus спасибо =null помог). Но ведь все равно получается что конструктор срабатывает лишний ненужный раз. Поправьте пожалуйста если я несу чушь

teddy Спасибо и ваш метод прекрасно работает. Только вот про newInstanceWithoutConstructor написано "Создаёт новый экземпляр класса без вызова конструктора"

те после...
$rc = new ReflectionClass('Example');
$example = $rc->newInstanceWithoutConstructor();
... у меня уже два экземпляра?
 
 Top
OrmaJever Модератор
Отправлено: 29 Апреля, 2014 - 22:47:35
Post Id



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


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


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




zzzzzz пишет:
Но ведь все равно получается что конструктор срабатывает лишний ненужный раз.

конструктор на то и конструктор что он срабатывает всегда при создании обьекта.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
teddy
Отправлено: 29 Апреля, 2014 - 22:57:09
Post Id


Участник


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


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




zzzzzz пишет:
у меня уже два экземпляра?

По сути да. Но они разные, один Example другой ReflectionClass

Это может быть полезно тогда, когда Вам надо поработать ещё с какими либо свойствами/методами класса не вызывая конструктор. А с использованием статического метода это не прокатит т.к он не возвратит Вам объект
 
 Top
zzzzzz
Отправлено: 29 Апреля, 2014 - 23:13:38
Post Id


Гость


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


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




Всем огромное спасибо.

В моем случае статистический метод подходит лучше, и самое главное я понимаю почему, но про =NULL и newInstanceWithoutConstructor безусловно знать нужно. Пробел в знаниях чуть-чуть прикрыл))

Надеюсь следующему поколению этот топик будет безусловно полезен. Еще раз всем спасибо
 
 Top
Stierus Супермодератор
Отправлено: 30 Апреля, 2014 - 09:58:17
Post Id



Рекордсмен по количеству сообщений за 7 дней


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


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




Конструктор - это метод, вызываемый при создании экземпляра класа для его начальной инициализации (тедди, конечно, написал кейс создания экземпляра класса без вызова конструктора через ReflectionClass, но это нельзя рассматривать как обычную практику). Если вам нужен метод, который то вызывается, то нет - напишите этот метод и вызывайте когда хотите.
 
My status
 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