Мне выдает такую ошибку: Код (Text): Cannot access private property User::$db in D:\Server\OpenServer\...\... on line 15 Честно говоря, я не знаю почему, но $db у меня стоит public. Я использовал Рефакторинг. P.S Рефакторинг у меня находится в конструкторе. --- Добавлено --- И конструктор объявлен таким образом: PHP: public function __construct($db, $dbl)
Ох, ну он огромный... Я покажу часть, ибо слишком большой: PHP: class User{ public $db; public $dbl; public $users; public $social; public function __construct($db, $dbl) { $this->db=$db; $this->dbl=$dbl; } public function xss($something) { $xss = new voku\helper\AntiXSS(); $xss_clean=$xss->xss_clean($something); return $xss_clean; } } --- Добавлено --- А все, нашел в чем проблема, я подключил class там где private $db. --- Добавлено --- Но вопрос, как мне выводить данные, например в User я выводил юзера таким образом $this->username, а теперь как? $this->user_class->$this->username; - просто тупо не выведется, ну это и понятно, но вот как по-другому реализовать... $this->user_class->username - если так, то придется писать функцию, a иначе не знаю.
@mkramer Ну да, логично. Хорошо, грубо говоря на примерах: PHP: <? class test1() { public function __construct() { //$this->name='123'; } public function vars() { $this->username='Admin'; } } class test2() { public function __construct() { $this->test1=new test1(); } public functio echo() { echo $this->test1->vars; } } $test= new test2(); $test->echo(); ?> Вообщем мне нужно вывести $this->username, но уже через другой класс.
А зачем? Ну можно так. Но давай вот что, ты мне напиши все ответственности твоего большого класса User, а я тебе попробую написать, как бы я его разбил, и почему. В том, что ты пока пытаешься делать, смысла большого нету. Рефакторинг должен упрощать, а не усложнять программу.
Нет, написать, за что он у тебя отвечает для начала. Только поподробнее. По пунктам 1. 2. 3. 4. .... 10. 11. и т.д.
@mkramer 1. Переменные, то есть получать все данные из базы данной. Например: $this->users=$this->db->getAll("SELECT * FROM ?n", 'users'); и т.д. все запросы записываются в массив, в данном случае $this->users - является массивом. 2. Функция которая приобразовывает строку с защитой от XSS 3. c_user - проверяет, эта "моя страница" или чужая. 4. form_aboutme - html форма изменения информации о себе. 5. comments - вывод всех комментарий. 6. add_comments - html форма с добавлением нового комментария. 7. ajax_add_comment - ajax обработчик формы add_comments. 8. edit_aboutme - ajax обработчик формы form_aboutme. 9. cfu_setting_form - форма настроек пользователя: 9.1. Функция: select_category - форма выбора категории. 9.2. Функция: enteractivity - график входов. 9.3. Функция: range_price - range-форма, диапазон цен. 9.4. Функция: othersettings - форма с различными настройками. 9.5. Функция: changepassword - форма с изменением пароля. 10. portfolio - html-форма отображения с портфолио: 10.1. Функция: create_portfolio - форма для создание портфолио. 10.2. Если c_user то: 10.2.1. Функция: upload_files - форма с загрузкой файлов в портфолио. 10.3. Функция: viwe_portfolio - форма с отображением контента портфолио. 11. save_configuration($cat1, $cat2, $cat3, $cat4, $cat5, $cat6, $cat7, $cat8, $ord, $inm, $otm, $ee, $cb, $cp, $cfu_f, $cfu_t) - ajax обработчик для настроек пользователя. В конце выглядит таким образом: PHP: $user->save_configuration($_POST['Websitedevelopment'], $_POST['Programming'], $_POST['Design\'n\'art'], $_POST['Audio\'n\'Video'], $_POST['Translations'], $_POST['Marketing\'n\'advertising'], $_POST['OptimizingSEO'], $_POST['Mobileapplications'], $_POST['orders'], $_POST['inmoney'], $_POST['outmoney'], $_POST['emailenter'], $_POST['changebalance'], $_POST['changepass'], $_POST['cfu_rubs_from'], $_POST['cfu_rubs_to']); 12. ajax_changepassword - ajax обработчик смены пароля (отправляет письмо для подтверждения). 13. __Hash_algorithm($str, $cut='0', $howmuch='0') - алгоритм кодирования пароля. 14. ajax_changepassword_before_emailconfirm($old, $new, $conf) - ajax запрос изменения пароля после подтверждения почты. 15. ajax_new_portfolio - ajax запрос создания портфолио. 16. ajax_upload_files($file, $arr_af) - ajax запрос загрузки файлов в портфолио. 17. ajax_Profile_delete_file($i, $n) - ajax запрос удаления из портфолио файла. 18. pro_account - отображение активности PRO статуса аккаунта. 19. confidentialitylevel - уровень индентификации пользователя. 20. money($type) - вывод лицевого счета. 21. fullname - вывод полного имени.
Она вообще тут каким боком? Вынеси в отдельный класс-хелпер статической функцией, заодно и доступ будет по всему проекту без создания экземпляра Ну я бы вынес это всё вообще из класса User. По мне, каждый экземпляр класса User должен представлять конкретного пользователя, а заниматься чтением и записью в базу должен класс UserRepository. https://habrahabr.ru/post/248505/ Комментарии - отдельная сущность, и к чему у тебя комментарии идут? Каким боком это всё сидит внутри User? Портфолио - совсем другая сущность, комментарии - ещё другая сущность. По портфолио я бы сделал PortfolioItem и PortfolioRepo, и в PortfolioRepo метод getPortfolioItemsOfUser($user). Тоже самое с комментариями. Просто потому что это другие сущности. Вот где жить твоему AJAX - мне труднее посоветовать, я почти всегда в программе, которая делает что-то большее, чем отправка почты с лендинга, использую MVC, так что это всё у меня живёт в контроллерах. Но у тебя явно уже не MVC, так что для начала (рефакторинг производится мелкими шагами) это можно не трогать. Но попытайся именно разные сущности. И тебе нужно что-то почитать хорошее по ООП. Применительно к PHP лучшая книга - это конечно Мэтт Зандстра, "PHP. Объекты, шаблоны и методики проектирования". Там ты приблизишься к пониманию, почему такие огромные классы - это плохо
Там чисто говоря просто присвоение другого класса: PHP: public function xss($something) { $xss = new voku\helper\AntiXSS(); $xss_clean=$xss->xss_clean($something); return $xss_clean; } Что касаемо этого, я буду сейчас изучать... Как же много я еще не знаю, на счет ООП.. Комментарии идут в профиле пользователя, поэтому я и занес к User. Мне контролер нужно было писать, прежде чем User Class?
Всё равно, это отдельная сущность, лучше не смешивать. А у тебя есть контроллер? Почему тогда у тебя его функции (всякий там ajax) выполняет класс User? --- Добавлено --- Разбухание классов может стать даже причиной провала проекта (у меня был такой горький опыт, правда мои плохие классы были не единственной причиной, но одной из них). Поэтому, чем крупнее проект, тем строже надо соблюдать все правила.
Ну, наверно стоило мне все расписать и продумать, прежде чем писать сам Class, да и вообще сайт. Нет, контролера нет, просто в User у меня находится все, что взаимодействует с пользователями. Возможно это не разумно и честно говоря даже не читабельно для меня самого. По мне так, лучше перепишу класс со всеми нюансами, рефликаторами и репозиториями, так будет грамотно и логично. Даже мой учить мне говорил: "Прежде чем создавать свой проект, для начала подумай, напиши все алгоритмы на бумаге, а после врывайся в бой".