[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Неправильное наследование?
nugle
есть два класса и почему то не проходят проверки... почему это происходит?


class insertUser
{
public $login;
public $name;
public $patronymic;
public $surname;
public $pass;
public $pass2;
public $country;
public $region;
public $city;
}

class createUser extends insertUser
{
function __construct()
{
$this->validData();
}

public function validData()
{
if(empty($login))
{
echo '<div>Поле логин осталось пустым</div>';
}
....
}
}


файл с вызовом классов
<?php

require "./class/register.php";

// Принимаем переменные

$login = !empty($_POST['login']) ? $_POST['login'] : null;
...


if(isset($sub))
{
$insertUser = new insertUser();

$insertUser->login = $login;

$createUser = new createUser();
}





Спустя 5 минут, 9 секунд (2.05.2011 - 11:17) pyha_coder написал(а):
<?php

require "./class/register.php";

// Принимаем переменные

$login = !empty($_POST['login']) ? $_POST['login'] : null;
...


if(isset($sub))
{
$User = new createUser();

$User->login = $login;

$User->create();
}


ты создаешь экземпляр наследуемого класса и присваеваешь $login внутри него, а валидация у тебя идет в наследнике. тебе надо установить $login в наследнике без создания экземпляра наследуемого класса.

Спустя 1 минута, 40 секунд (2.05.2011 - 11:19) Mirexzpalich написал(а):
$insertUser = new insertUser();v //взяли класс insertUser

$insertUser->login = $login; // В нем установили login
$createUser = new createUser();// взяли класс createUser, в не login будет дефолтовый, это совершенно новый класс никак не зависящий от $insertUser

Спустя 2 минуты, 24 секунды (2.05.2011 - 11:21) alex12060 написал(а):

$insertUser = new insertUser();

$insertUser->login = $login;

$createUser = new createUser();


Понаписал однако :)

Вообще, надо так:


$insertUser = new insertUser();
$insertUser->login = $login;


Но смотря на твои классы, я не уверен, что оное сработает.

Спустя 4 минуты, 8 секунд (2.05.2011 - 11:25) pyha_coder написал(а):
Вот так будет все работать.



class insertUser
{
public $login;
public $name;
public $patronymic;
public $surname;
public $pass;
public $pass2;
public $country;
public $region;
public $city;
}

class createUser extends insertUser
{
function __construct(){}

public function Create(){
$this->validData();
}

public function validData()
{
if(empty($login))
{
echo '<div>Поле логин осталось пустым</div>';
}
....
}
}



<?php

require "./class/register.php";

// Принимаем переменные

$login = !empty($_POST['login']) ? $_POST['login'] : null;
...


if(isset($sub))
{
$User = new createUser();

$User->login = $login;

$User->create();
}


Спустя 2 минуты, 44 секунды (2.05.2011 - 11:28) neadekvat написал(а):
Зачем класс insertUser? Он еще унаследуется кем-нибудь? Если нет - перенеси свойства в класс creatUser и все.

Цитата (alex12060 @ 2.05.2011 - 12:21)
Но смотря на твои классы, я не уверен, что оное сработает.

Потому что надо
$insertUser = new createUser();
$insertUser->login = $login;


Хотя нет. Проектирование вообще печальное.
В конструкторе вызывается валидатор, который использует неопределенную переменную.
Логин - public. Так валидация не пройдет. Надо объявить свойства protected, и создать метод, который будет принимать значения этих свойств, обрабатывать их валидатором и присваивать внутри объекта, если валидация прошла.

Спустя 8 минут, 14 секунд (2.05.2011 - 11:36) pyha_coder написал(а):
У него проблемо конкретно в в том что я описал выше.


$insertUser = new insertUser();

$insertUser->login = $login;

$createUser = new createUser();

var_dump($createUser);

покажет что $this->login = null. проблема в наследовании, скорее всего в непонимании что это и как оно.

Спустя 2 минуты, 9 секунд (2.05.2011 - 11:38) nugle написал(а):
поменял на вот такое, результат тот же
class createUser
{
public $login;
public $name;
public $patronymic;
public $surname;
public $pass;
public $pass2;
public $country;
public $region;
public $city;

public function validData()
{
if(empty($login))
{
echo '<div>Поле логин осталось пустым</div>';
}
....
}
}


<?php

require "./class/register.php";

// Принимаем переменные

$login = !empty($_POST['login']) ? $_POST['login'] : null;
...


if(isset($sub))
{
$createUser = new createUser();
$createUser->login = $login;

$createUser -> validData();

}

Спустя 5 минут, 45 секунд (2.05.2011 - 11:44) pyha_coder написал(а):


$login = !empty($_POST['login']) ? $_POST['login'] : null;

if(empty($login))
{
$createUser = new createUser();
$createUser->login = $login;

$createUser -> validData();

}

Спустя 1 минута, 42 секунды (2.05.2011 - 11:46) neadekvat написал(а):
nugle, я позже добавил:
Цитата (neadekvat @ 2.05.2011 - 12:28)
Хотя нет. Проектирование вообще печальное.
В конструкторе вызывается валидатор, который использует неопределенную переменную.
Логин - public. Так валидация не пройдет. Надо объявить свойства protected, и создать метод, который будет принимать значения этих свойств, обрабатывать их валидатором и присваивать внутри объекта, если валидация прошла.


Спустя 19 минут, 1 секунда (2.05.2011 - 12:05) pyha_coder написал(а):

class user
{
public $login;
public $name;
public $patronymic;
public $surname;
public $pass;
public $pass2;
public $country;
public $region;
public $city;
public $error;

public function __construct(){
$this->login = !empty($_GET['login']) ? $_GET['login'] : null;
}


public function printError(){
echo $this->error;
}

public function isValid(){
if(!empty($this->login)){
return true;
}

$this->error = '<div>Поле логин осталось пустым</div>';

return false;
}

public function Create(){
echo 'user create';
}
}



$user = new User();

if($user->isValid()){

$user->create();
}else {
$user->printError();
}

Спустя 14 минут, 33 секунды (2.05.2011 - 12:19) neadekvat написал(а):
Да ё ж моё. Нельзя в классе работать c _GET и другими подобными вещами, за редким исключением.

class user
{
protected $errors;

public function add_user($login, $name){
$this->isValide($login, 'Некорректно введен логин');
$this->isValide($name, 'Некорректно введено имя');

if (empty($this->errors)) {
mysql_query("INSERT..");
return true;
} else
return
false;
}


public function get_errors(){
return implode("\n", $this->errors);
}


protected function isValid($data, $err_msg){
if (empty($data))
$this->errors[] = $err_msg;
}
}


$user = new user;
$user = add_user($_POST['login'], $_POST['name']);
if ( ! $user)
echo $user->get_errors();
else
echo 'user added';

Не запускал.

Спустя 13 минут, 12 секунд (2.05.2011 - 12:32) pyha_coder написал(а):
Кто запретил? Это пример, не готовое решение.

Спустя 1 минута, 4 секунды (2.05.2011 - 12:34) neadekvat написал(а):
Цитата (pyha_coder @ 2.05.2011 - 13:32)
Кто запретил? Это пример, не готовое решение.

Здравый смысл.

Спустя 8 минут, 35 секунд (2.05.2011 - 12:42) nugle написал(а):
neadekvat
сделал всё как ты написал, но после return var_dump($this->errors);
возвращает Null
сделал всё кроме, где add_user() в скобках пусто оставил, а переменные из вне определяю

$createUser = new createUser();

$createUser->login = $login;
$createUser->name = $name;
$createUser->patronymic = $patronymic;
$createUser->surname = $surname;
$createUser->pass = $pass;
$createUser->pass2 = $pass2;
$createUser->country = $country;
$createUser->region = $region;
$createUser->city = $city;
$createUser->sub = $sub;

if(!empty($createUser))
echo $createUser->get_errors();

Спустя 2 минуты, 16 секунд (2.05.2011 - 12:44) neadekvat написал(а):
Цитата (nugle @ 2.05.2011 - 13:42)
сделал всё как ты написал, но после return var_dump($this->errors);
возвращает Null

А не надо делать все, как я написал. Надо посмотреть, проникнуться идеей, подумать своей головой и написать своими ручками.
Или всю жизнь копировать будешь?

Спустя 2 минуты, 14 секунд (2.05.2011 - 12:47) nugle написал(а):
а если переменные из вне добавлять, а не через метод, то не получится?

Спустя 2 минуты, 52 секунды (2.05.2011 - 12:50) neadekvat написал(а):
Цитата (nugle @ 2.05.2011 - 13:47)
а если переменные из вне добавлять, а не через метод, то не получится?

Получится.
Но если данные должны пройти проверки - то почему бы их не проверить сразу? Ты когда в зону вылета проходишь - тебя сразу проверят, а не сначала запустят, а потом будут вылавливать и проверять.

Спустя 8 минут, 13 секунд (2.05.2011 - 12:58) nugle написал(а):
не понимаю в чем дело, делаю так, но все равно Null
<?php

class
createUser
{
public $login;
public $name;
public $patronymic;
public $surname;
public $pass;
public $pass2;
public $country;
public $region;
public $city;
protected $errors;



public function get_errors(){
var_dump($this->errors);
}
public function add_user()
{
$this->isValide($this->login, '<div>Поле логин осталось пустым</div>');
$this->isValide($this->name, '<div>Поле имя осталось пустым</div>');
$this->isValide($this->patronymic, '<div>Поле отчество осталось пустым</div>');
$this->isValide($this->surname, '<div>Поле фамилия осталось пустым</div>');
$this->isValide($this->pass, '<div>Поле повторного пароля логин осталось пустым</div>');
$this->isValide($this->pass2, '<div>Поле страна осталось пустым</div>');
$this->isValide($this->country, '<div>Поле регион осталось пустым</div>');
$this->isValide($this->region, '<div>Поле город осталось пустым</div>');
$this->isValide($this->city, '<div>Поле логин осталось пустым</div>');

}
protected function isValid($data, $err_msg){
if (empty($data))
$this->errors[] = $err_msg;
}
}


$createUser = new createUser();

$createUser->login = $login;
$createUser->name = $name;
$createUser->patronymic = $patronymic;
$createUser->surname = $surname;
$createUser->pass = $pass;
$createUser->pass2 = $pass2;
$createUser->country = $country;
$createUser->region = $region;
$createUser->city = $city;
$createUser->sub = $sub;

if(!empty($createUser))
$createUser->get_errors();
else
echo 'pusto';



Спустя 2 минуты, 13 секунд (2.05.2011 - 13:00) neadekvat написал(а):
Что-то я не увидел вызова add_user.

Спустя 4 минуты, 31 секунда (2.05.2011 - 13:04) nugle написал(а):
спасибо, получилось, я вызвал в get_errors, это правильно?

Спустя 4 минуты, 1 секунда (2.05.2011 - 13:08) neadekvat написал(а):
Нет. get_errors должно только возвращать ошибки.
Я бы сделал так (если отталкиваться от имеющегося):
В add_user снизу добавить
if (empty($this->errors)) {
mysql_query("INSERT..");
return true;
} else
return
false;

А использовал бы класс нет:
$createUser = new createUser();

$createUser->login = $login;
$createUser->name = $name;
$createUser->patronymic = $patronymic;
$createUser->surname = $surname;
$createUser->pass = $pass;
$createUser->pass2 = $pass2;
$createUser->country = $country;
$createUser->region = $region;
$createUser->city = $city;
$createUser->sub = $sub;

$add_user = $createUser->add_user()

if( ! $add_user)
$createUser->get_errors();
else
echo 'pusto';

Спустя 37 минут, 30 секунд (2.05.2011 - 13:46) nugle написал(а):
спасибо, всё получилось!

Спустя 18 часов, 58 минут, 47 секунд (3.05.2011 - 08:45) linker написал(а):
Вот это вот
$createUser->login = $login;
$createUser->name = $name;
$createUser->patronymic = $patronymic;
$createUser->surname = $surname;
$createUser->pass = $pass;
$createUser->pass2 = $pass2;
$createUser->country = $country;
$createUser->region = $region;
$createUser->city = $city;
$createUser->sub = $sub;
по человечьи, засовывается в конструктор.

Спустя 1 час, 8 минут, 54 секунды (3.05.2011 - 09:54) nugle написал(а):
linker
эти переменные ведь из пост достаются, придётся все переменные глобальными делать?

Спустя 5 минут, 26 секунд (3.05.2011 - 09:59) linker написал(а):
nugle
А кто и когда запрещал передавать в конструктор эти переменные в качестве параметров?
class MyClass
{
public $a = 1;
public $b = array();

public function __construct($pa = 1, array $pb = array())
{
$this->a = $pa;
$this->b = $pb;
}
}


$o = new MyClass(10, array(4, 5, 6));

Спустя 17 минут, 23 секунды (3.05.2011 - 10:16) nugle написал(а):
сейчас 10 переменных, а потом 30 к примеру и их все в конструктор пихать?

Спустя 1 час, 13 минут (3.05.2011 - 11:29) linker написал(а):
nugle
Массив, не? Когда используются динамические поля, то делают это так
class MyClass
{
protected $_Properties = array();

public function __construct(array $Props = array())
{
// Заполняем массив $this->_Properties из $Props;
}

public function __set($Name, $Value)
{
$this->_Properties[$Name] = $Value;
}

public function __get($Name)
{
return isset($this->_Properties[$Name]) ? $this->_Properties[$Name] : null;
}
}
и уже похрену, 20, 30 или 1000 параметров.

Спустя 20 минут, 59 секунд (3.05.2011 - 11:50) nugle написал(а):
а для чего вообще нужен __set и __get , тут разве без них не обойтись?

Спустя 10 минут, 38 секунд (3.05.2011 - 12:01) linker написал(а):
__set() нужен, чтобы написать
$object->name = 'my name';
а __get() нужен, что написать
echo $object->name;
читаем больше про ООП в PHP.

Спустя 4 минуты, 28 секунд (3.05.2011 - 12:06) nugle написал(а):
linker
это понятно, а мы же в конструкторе так делаем

public function __construct(array $Props = array())
{
$this->name = $Props[1];
}

Спустя 8 минут, 37 секунд (3.05.2011 - 12:14) linker написал(а):
И что? Не важно где ты это делаешь, если поле не описано в классе, то вызывается один из магических методов __set() или __get().
class MyClass
{
protected $_Properties = array();

public function __construct(array $Props = array())
{
if (!isset($Props['name']))
throw new Exception('Вы не заполнили поле Name.');
$this->name = $Props['name'];
}

public function __set($Name, $Value)
{
$this->_Properties[$Name] = $Value;
}

public function __get($Name)
{
return isset($this->_Properties[$Name]) ? $this->_Properties[$Name] : null;
}
}

try
{
$o = new MyClass($_POST);
echo $o->name;
}
catch(Exception)
{
$Exception->getMessage();
}

Спустя 1 минута, 49 секунд (3.05.2011 - 12:16) nugle написал(а):
linker
блин, я запутался во всём этом, а просто

public function __construct(array $Props = array())
{
$this->name = $Props[1];
}

выдает ошибки, если поле не заполнено!

Спустя 5 минут, 42 секунды (3.05.2011 - 12:22) linker написал(а):
Есть класс
class MyClass
{
protected $_Properties = array()
}
в нем определено только одно защищенное поле $_Properties, в котором будут храниться динамические поля объекта. Когда мы создаем экземпляр этого класса
$o = new MyClass()
а потом пытаемся установить значение для несуществующего поля какое-то значение
$o->name = 'My name';
то, PHP запускает при наличии магический метод __set(), в котором разработчик добавляет это поле в список
$this->_Properties[$Name] = $Value
где
$Name - название поля
$Value - устанавливаемое значение для поля.
После этого можно написать
echo $o->name;
, опять же не найдя описанного поля name, PHP запустит магический метод __get(), в котором программист достанет его значение из $_Properties.

Спустя 3 минуты, 2 секунды (3.05.2011 - 12:25) nugle написал(а):
linker
мне не нужно потом менять, но смысл я уловил!
а как сделать чтобы из-за конструктора ошибки не вылазили?

Спустя 7 минут, 51 секунда (3.05.2011 - 12:33) linker написал(а):
А какие ошибки?

Спустя 8 минут (3.05.2011 - 12:41) nugle написал(а):
Notice: Undefined offset: 1 in C:\WebServers\home\register.ru\www\class\register.php on line 21

Спустя 1 час, 45 минут, 42 секунды (3.05.2011 - 14:26) neadekvat написал(а):
linker, усложнять программу у тебя уже в крови, по-моему smile.gif Даже исключение успел сунуть.

Спустя 30 минут, 31 секунда (3.05.2011 - 14:57) Invis1ble написал(а):
Хорошо хоть не мини фреймворк smile.gif

Спустя 7 часов, 9 минут, 47 секунд (3.05.2011 - 22:07) linker написал(а):
neadekvat
Это не усложнение, а достижение желаемого результата.

Спустя 17 минут, 10 секунд (3.05.2011 - 22:24) neadekvat написал(а):
Цитата (linker @ 3.05.2011 - 23:07)
Это не усложнение, а достижение желаемого результата.

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

Спустя 9 часов, 52 минуты, 35 секунд (4.05.2011 - 08:16) linker написал(а):
neadekvat
Если у тебя есть иные методы для работы с динамическими полями объектов, то велком, код в студию. Изначально всё было просто, перенести заполнение полей объекта $createUser в его конструктор. Потом было высказано, что параметров может быть 10, а потом может быть 20 и т.д., т.е. прослеживается динамика при передаче параметров. Откуда идёт вывод, отдавать массив с данными в консруктор, а уж он сам разберёт что и как. Это не усложнение, это концентрация обязанностей в тех местах, где они действительно нужны. А это не только упрощает всю последующую работу, но и избавляет от всяких негативных артефактов, типа дублирования кода и т.д.

nugle
Эта ошибка говорит о том, что в массиве нет элемента под индексом 1.

Спустя 50 минут, 1 секунда (4.05.2011 - 09:06) nugle написал(а):
linker
я же и написал, как быть если массив пуст!

Спустя 50 минут, 42 секунды (4.05.2011 - 09:57) linker написал(а):
nugle
А ты не знаешь как проверяется массив на пустоту?

Спустя 4 часа, 9 минут, 25 секунд (4.05.2011 - 14:06) nugle написал(а):
я знаю, но потом в конструкторе если он пуст вызывать функцию?

Спустя 40 минут, 9 секунд (4.05.2011 - 14:47) linker написал(а):
Какую функцию? Можешь заранее проверить пустой ли массив, зачем лишний раз гонять PHP и съедать память под объекты.

Спустя 3 часа, 22 минуты, 21 секунда (4.05.2011 - 18:09) pyha_coder написал(а):
Цитата (linker @ 4.05.2011 - 06:57)
А ты не знаешь как проверяется массив на пустоту?

Как?

Спустя 1 час, 59 минут, 6 секунд (4.05.2011 - 20:08) twin написал(а):
empty()

Спустя 13 часов, 56 минут (5.05.2011 - 10:04) nugle написал(а):
linker
мне нужно например аяксом выводить в определенном месте!
т.е.мне надо вызвать типа
__construct($Props)
{
if(isValidEmpty($Props[1]) == true)
$this->login = $Props[1];
else echo isValidEmpty($Props[1]) ;
}

ха, написал и сам все понял!
спасибо!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.