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
Форумы портала PHP.SU :: Версия для печати :: Необязательный вызов конструктора
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Необязательный вызов конструктора

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

1. zzzzzz - 29 Апреля, 2014 - 17:25:57 - перейти к сообщению
Здравствуйте. Чет я туплю
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 не использует свойства класса. Мне нечего ему передать


Где я повернул не туда?
2. Ch_chov - 29 Апреля, 2014 - 17:29:13 - перейти к сообщению
Наверно все таки аргумент требуется при создании объекта, а не при вызове метода.
И что значит "не обязательный вызов конструктора"?
3. zzzzzz - 29 Апреля, 2014 - 17:39:56 - перейти к сообщению
Ошибся, при создании объекта, мне нечего передать, ведь вызываемый метод ниже не использует свойство mysqli

Как код сделать рабочим?
4. Ch_chov - 29 Апреля, 2014 - 17:49:42 - перейти к сообщению
Сделайте met2 статическим методом класса
5. OrmaJever - 29 Апреля, 2014 - 17:50:53 - перейти к сообщению
zzzzzz пишет:
ведь вызываемый метод ниже не использует свойство mysqli

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

PHP:
скопировать код в буфер обмена
  1. $myClass = new MyClass($mysqliVar);
  2. $myClass->met2();
6. zzzzzz - 29 Апреля, 2014 - 21:16:30 - перейти к сообщению
Конструктор должен принимать параметр и выполняться если при создании объекта я передаю параметр new MyClass( $mysqliVar ) , но если делаю так new MyClass; то конструктор как бы должен идти лесом

Это в идеале )

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

Сейчас реализовано так
и
PHP:
скопировать код в буфер обмена
  1. MyClass::met2();
Правильно?
7. IllusionMH - 29 Апреля, 2014 - 21:21:20 - перейти к сообщению
zzzzzz пишет:
но если делаю так new MyClass; то конструктор как бы должен идти лесом

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

Реализуется через статический метод, как уже и сделано.
8. zzzzzz - 29 Апреля, 2014 - 21:22:56 - перейти к сообщению
Думаю статистические методы как раз для этих целей были введены
9. Stierus - 29 Апреля, 2014 - 21:37:35 - перейти к сообщению
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.  
10. teddy - 29 Апреля, 2014 - 22:02:36 - перейти к сообщению
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
11. zzzzzz - 29 Апреля, 2014 - 22:43:41 - перейти к сообщению
Stierus спасибо =null помог). Но ведь все равно получается что конструктор срабатывает лишний ненужный раз. Поправьте пожалуйста если я несу чушь

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

те после...
$rc = new ReflectionClass('Example');
$example = $rc->newInstanceWithoutConstructor();
... у меня уже два экземпляра?
12. OrmaJever - 29 Апреля, 2014 - 22:47:35 - перейти к сообщению
zzzzzz пишет:
Но ведь все равно получается что конструктор срабатывает лишний ненужный раз.

конструктор на то и конструктор что он срабатывает всегда при создании обьекта.
13. teddy - 29 Апреля, 2014 - 22:57:09 - перейти к сообщению
zzzzzz пишет:
у меня уже два экземпляра?

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

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

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

Надеюсь следующему поколению этот топик будет безусловно полезен. Еще раз всем спасибо
15. Stierus - 30 Апреля, 2014 - 09:58:17 - перейти к сообщению
Конструктор - это метод, вызываемый при создании экземпляра класа для его начальной инициализации (тедди, конечно, написал кейс создания экземпляра класса без вызова конструктора через ReflectionClass, но это нельзя рассматривать как обычную практику). Если вам нужен метод, который то вызывается, то нет - напишите этот метод и вызывайте когда хотите.

 

Powered by ExBB FM 1.0 RC1