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
$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 написал(а):
У него проблемо конкретно в в том что я описал выше.
покажет что $this->login = null. проблема в наследовании, скорее всего в непонимании что это и как оно.
$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
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() в скобках пусто оставил, а переменные из вне определяю
сделал всё как ты написал, но после 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 снизу добавить
А использовал бы класс нет:
Я бы сделал так (если отталкиваться от имеющегося):
В 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и уже похрену, 20, 30 или 1000 параметров.
{
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 минут, 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 написал(а):
Есть класс
$Name - название поля
$Value - устанавливаемое значение для поля.
После этого можно написать
class MyClassв нем определено только одно защищенное поле $_Properties, в котором будут храниться динамические поля объекта. Когда мы создаем экземпляр этого класса
{
protected $_Properties = array()
}
$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, усложнять программу у тебя уже в крови, по-моему
Даже исключение успел сунуть.

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

Спустя 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.
Если у тебя есть иные методы для работы с динамическими полями объектов, то велком, код в студию. Изначально всё было просто, перенести заполнение полей объекта $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]) ;
}
ха, написал и сам все понял!
спасибо!