Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Не передается параметр в конструктор класса.


Автор: Kotakota 22.4.2011, 10:11
Привет.

Файл index.php

Код

<?php
$myV = 'Hello';
$myClass = new TestClass($myV);
$myClass->run();
?>


Файл TestClass.php

Код

<?php
class TestClass {
public $myVariable;
function __construct($myVariable){
$this->myVariable = $myVariable;
}
public function run() {
// .... blahblah
}
}
?>


При передаче аргумента конструктору возникает следующая ошибка:

Warning: Missing argument 1 for TestClass::__construct() in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\TestClass.php on line 3

Notice: Undefined variable: myVariable in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\TestClass.php on line 4

Автор: DenWPF 22.4.2011, 10:17
public myVariable; может нужно $ поставить?

пишет же Undefined variable: myVariable т.е переменная не определена

Автор: нуп 22.4.2011, 10:18
Цитата(Kotakota @  22.4.2011,  10:11 Найти цитируемый пост)
public $myVariable;


Автор: Kotakota 22.4.2011, 10:22
Это опечатка.
Знак $ там был.
Поправил.

Ошибка актуальна!

Автор: ksnk 22.4.2011, 10:25
Цитата(Kotakota @  22.4.2011,  10:22 Найти цитируемый пост)
Это опечатка.

А больше опечаток нет? Откуда берется Controller,
Цитата(Kotakota @  22.4.2011,  10:11 Найти цитируемый пост)
Missing argument 1 for Controller::__construct() 


Автор: Kotakota 22.4.2011, 10:29
Цитата(ksnk @ 22.4.2011,  10:25)
Цитата(Kotakota @  22.4.2011,  10:22 Найти цитируемый пост)
Это опечатка.

А больше опечаток нет? Откуда берется Controller,
Цитата(Kotakota @  22.4.2011,  10:11 Найти цитируемый пост)
Missing argument 1 for Controller::__construct() 

Исправил.
Больше опечаток нет.

Заметил вот, что:
Код

<?php
class TestClass {
public $myVariable;
function __construct($myVariable=null){
$this->myVariable = $myVariable;
}
public function run() {
// .... blahblah
}
}
?>


Все работает!
И в чем была проблема?

Версия PHP: 5.3

Автор: DenWPF 22.4.2011, 10:40
страно конечно, значит надо инициализировать поля.

Автор: Kotakota 22.4.2011, 10:48
Цитата(DenWPF @ 22.4.2011,  10:40)
страно конечно, значит надо инициализировать поля.

Это очень странно.
Переменные в PHP не имеют типа.
Какого типа значения, такого типа будет и переменная...

Автор: DenWPF 22.4.2011, 10:57
5.3 может так и есть.

Автор: SneG0K 22.4.2011, 11:23
PHP Version 5.3.3-1ubuntu9.3
Все в порядке
Код

class TestClass {
public $myVariable;
function __construct($myVariable){
$this->myVariable = $myVariable;
}
public function run() {
// .... blahblah
echo $this->myVariable;
}
}
$myV = 'Hello';
$myClass = new TestClass($myV);
$myClass->run();
phpinfo();

Автор: Kotakota 22.4.2011, 11:48
Смысл следующий!
От класса TestClass куда передаются аргументы в конструктор наследуются другие классы.
И вот когда вызывается наследуемый класс, то срабатывает конструктор (не понятно почему?) класса родителя.
Естественно, что там $config будет пустая, так-как с index.php уже ничего не передается...
Вот поэтому, когда я поставил __construct($myVariable=null) все сработало без ошибки.
Непонятно почему вызывается конструктор родителя, при вызове класса наследника?
Классы наследники вызываются у меня через Reflection.

Автор: SneG0K 22.4.2011, 11:51
Конструктор переопределен? Если нет, то тогда вызывается родительский.

Добавлено через 29 секунд
То что в первом топике никак не связано с наследованием.

Автор: Kotakota 22.4.2011, 11:55
Цитата(SneG0K @ 22.4.2011,  11:51)
Конструктор переопределен? Если нет, то тогда вызывается родительский.

Добавлено @ 11:51
То что в первом топике никак не связано с наследованием.


Имеется такая структура:

Файл index.php

Код

<?php
$myV = require_once('folder/conf.php');
$myClass = new TestClass($myV);
$myClass->run();
?>



Файл TestClass.php

Код

<?php
class TestClass {
public $myVariable;
public $threeClass;
function __construct($myVariable){
$this->myVariable = $myVariable;
$this->threeClass = new ThreeClass();
}
public function run() {
// .... blahblah
}

public function getThree() {
    return $this->threeClass;
}
}
?>



Файл SomeClass.php

Код

Class SomeClass extends TestClass {

public function someFunction() {

$this->getThree()->threesomeFunction();

}


Файл ThreeClass.php

Код

Class ThreeClass {

public function threesomeFunction() {

//...blahblah

}

}


Когда вызывается метод someFunction() класса SomeClass, происходит вызов конструктора родительского класса TestClass.
Так - как в момент вызова аргумент (myVariable) передающийся в конструктор класса TestClass, не определен, получаем ошибку:

Warning: Missing argument 1 for TestClass::__construct() in C:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\TestClass.php on line 4
Notice: Undefined variable: myVariable in C:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\TestClass.php on line 5

Передается этот аргумент в конструктор класса TestClass, только один раз, при вызове index.php.

Делаю дальше.
В файл класса SomeClass дописываю свой конструктор, чтобы он не наследовался по умолчанию и не пытался передать аргумент (myVariable).

Файл SomeClass.php

Код

Class SomeClass extends TestClass {

function __construct(){
    }

public function someFunction() {

$this->getThree()->threesomeFunction();

}


Получаем следующую ошибку:
Fatal error: Call to a member function threesomeFunction() on a non-object in C:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\SomeClass.php on line 8

Помогите разобраться!
 smile 

Автор: Kotakota 24.4.2011, 21:15
Вроде все правильно описал.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)