Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
21 / 21 / 6
Регистрация: 12.12.2010
Сообщений: 677
1

Может кто-то подскажет, где можно научиться писать красивый, качественный код

01.08.2016, 15:48. Просмотров 1318. Ответов 26
Метки нет (Все метки)


Здравствуйте! У меня возникла проблема.. Она уже как лет 6 Пишу на php уже 6-й год, но толком ни наследование, ни абстракцию, ни интерфейсы не применяю. Пишу исключительно без фреймворков. Сам. Движки самописные, по наработанной концепции. И вот всё время смотря на мой код вроде этого:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
class LOADER {
    public $conf;
    public $db;
    public $action;
    public $templater;
    public $test = "trololo";
    public $route;
    private $saying;
    
    public function __construct() {
        require_once('core/class_configs.php');
        $this->conf = new CONFIGS();
        
        require_once('core/class_db.php');
        $this->db = new DB();
        
        $this->action = explode('/', $_SERVER['REQUEST_URI']);
        require_once('core/class_templater.php');
        $this->templater = new TEMPLATER();
        
        require_once('core/class_route.php');
        $this->route = new ROUTE();
    }
    
    static function AppRun() {
        echo $this->route->Route();
    }
}
меня называют бездарным аутистом. И я после очередной попытки написать что то новое, усовершенствовать в своих старых навыках написания движка что то - обламываюсь, вхожу в депресуху и понимаю что я "ламер"(быдлокодер). Может кто то подскажет, где можно научиться писать красивый, качественный код, поддержит меня в том что ещё возможно написание проектов с "нуля"(без фреймворков), скажет плюсы такого написания, и скажет в какую сторону копать и что изучить? А то скоро точно пойду дворником или официантом работать, ибо глядя в мой код, при попытке устроиться на работу - на собеседованиях только и слышал что "Спасибо! Мы Вам перезвоним".
Хотелось бы немного подискусировать на эту тему с опытным человеком (может ВК или ещё где то), что не так во мне и почему я так заострился, что 6-й год делая проекты - я стою на месте и деградирую.
Спасибо, хотя бы за то, что прочитали это. Большое спасибо, если ещё поможете/подскажете что мне делать.
Премного благодарен! Всего доброго!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.08.2016, 15:48
Ответы с готовыми решениями:

Как научиться писать красивый, масштабируемый, понятный код на php?
Как научиться писать красивый, масштабируемый, понятный код на php? Сразу сниму ответы типа...

Кто подскажет где и как можно начать зарабатывать в интернете?
Кто подскажет где и как можно заработать денег в интернете. Какой не будь особо не затратный метод...

Кто нибудь подскажет где можно найти исходник С/C++ алгоритм сжатия
Народ помогите, у меня времени нет чтобы самому разрабатывать алгоритм сжатия очень нужен алгоритм...

Можно ли писать такой код, чтобы я мог где-то вставить нужный код у он появился во всех страницах
Вомщем, у меня есть сайт и у него есть очень много страниц и чтобы когда нужно что-то вставить на...

__________________
Помогаю в написании курсовых работ и дипломов здесь.
Записывайтесь на профессиональные курсы Fullstack-разработчиков на PHP‌
26
Хитрая блондиночка $)
1461 / 976 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
01.08.2016, 16:05 2
Цитата Сообщение от Linked Посмотреть сообщение
меня называют бездарным аутистом.
И чем обьясняют?
0
23 / 23 / 7
Регистрация: 27.07.2015
Сообщений: 149
01.08.2016, 16:44 3
Зачем слушать других? Если самому хочется писать на ООП, тогда это другое дело! Возьми книгу по ООП-php, потом переделай свой проект используя ООП, вот и научишься)
0
21 / 21 / 6
Регистрация: 12.12.2010
Сообщений: 677
01.08.2016, 16:58  [ТС] 4
Hikari, тем что код кривой..
0
Эксперт PHP
3572 / 2993 / 1258
Регистрация: 01.08.2012
Сообщений: 10,255
01.08.2016, 17:19 5
Цитата Сообщение от Linked Посмотреть сообщение
подскажете что мне делать
Для начала почитать про spl_autoload_register и убрать все require_once.
1
Эксперт .NET
7522 / 5016 / 1194
Регистрация: 25.05.2015
Сообщений: 15,300
Записей в блоге: 14
01.08.2016, 17:19 6
Linked, без фреймворков - когда их возможностей не хватает, тогда пишется свой. В остальном это велосипедостроение и напрасная трата времени. Не зная фреймворков, не желая с ними работать, Вы не въедете в устройство существующих сайтов (на них построеннных), а будете дальше велосипедить.
0
Хитрая блондиночка $)
1461 / 976 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
01.08.2016, 17:26 7
Цитата Сообщение от Linked Посмотреть сообщение
тем что код кривой
О! Я когда спросонья, то в зеркале тоже такое вижу...
0
Rius
01.08.2016, 17:27
  #8

Не по теме:

Hikari, если ночью подойти к зеркалу в темноте, и сфоткать себя со вспышкой, и не такое увидишь...

0
Hello Kitty
688 / 561 / 401
Регистрация: 12.02.2016
Сообщений: 1,436
Записей в блоге: 1
01.08.2016, 17:30 9
Цитата Сообщение от Linked Посмотреть сообщение
на собеседованиях только и слышал что "Спасибо! Мы Вам перезвоним"
ну не все так плохо. вас хотя бы на собеседования зовут, мне сразу отказывают
1
Супер-модератор
8745 / 2474 / 140
Регистрация: 07.03.2007
Сообщений: 11,747
01.08.2016, 20:13 10
можно один уточняющий вопрос: ваш код работает криво? для решения ваших задач ваших знаний хватает? или за вас, как в том детском стихотворении: Папа решает, а Коля сдает? (не в обиду)... конечно, всегда надо быть в поиске знаний, это никому не повредит... но пока интересна сама постановка задачи... на счет бездарного аутиста и все такое... просто лишая себя уверенности в своих силах, вы лишаете себя возможности достигнуть желаемого... психологией потянуло...
1
21 / 21 / 6
Регистрация: 12.12.2010
Сообщений: 677
02.08.2016, 12:42  [ТС] 11
Lord_Voodoo, Вы всё правильно говорите! Психология, именно она многое решает! Мне нравится самому писать код, самому всё делать. А если какая-то новая задача с которой я ещё не сталкивался - я конечно задаю вопросы, мне ПОМОГАЮТ, а я, непосредственно, получаю новый опыт) В этом моя суть развития)

Добавлено через 1 минуту
Jodah, можете пожалуйста в конкретном отрывке кода что у меня - привести пример применения функции автозагрузки, как бы она была реализована.. Я читал про автозагрузку, пробовал применять, но у меня что то не работало, когда я попросил подсказать что не так - в меня швырнули книгу по ООП и скаали иди читай
0
Супер-модератор
8745 / 2474 / 140
Регистрация: 07.03.2007
Сообщений: 11,747
02.08.2016, 12:48 12
Linked, ну вот так уже получше будет... а то бездарность, аутизм приписали себе... кстати, а разве мы все не аутисты по сути?

погружённость человека в себя, стремление уйти от контактов с окружающим миром.
по сути описание моего состояния во время кодинга... а на счет бездарности - ну да, гении предлагают идеи, а потом куча бездарных, но зато боевых лошадок эти идеи реализует... а что есть идея без ее реализации - набор красивых слов... а много бы накодили эти самые гении, не было бы вот той армии посредственных (на первый взгляд) программистов, кодеров... да и вообще все это понятия относительные... каждый гениален по-своему... даже в тупости есть свои гении... так что выше нос, и держать хвост пистолетом, ибо мы, по крайней мере я, простые программисты, и есть тот атлант, на котором держится небосвод...
1
Эксперт PHP
3572 / 2993 / 1258
Регистрация: 01.08.2012
Сообщений: 10,255
02.08.2016, 13:03 13
Linked, так в документации есть пример:
PHP
1
2
3
4
5
6
7
<?
function my_autoloader($class) {
    include 'classes/' . $class . '.class.php';
}
 
spl_autoload_register('my_autoloader');
?>
Допустим, у вас все классы написаны большими буквами. Все они лежат в /core/. И название файла легко вычислить, взяв название класса в нижнем регистре и добавив 'class_' слева и '.php' справа, т.е. ROUTE => '/core/class_route.php'.

Тогда автолоадер будет примерно таким:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
function autoloader($class)
{
    $file = '/core/class_' . mb_strtolower($class) . '.php';
 
    if(file_exists($file))
        require_once($file);
    else
        die('Божечки, файл класса ' . $class . ' не найден!');
}
 
spl_autoload_register('autoloader');
?>
Разумеется, здесь можно учесть, что классы могут быть разбросаны по разным папкам. Например, у меня классы наименовываются примерно так:
C_Product - контроллер
M_Product - модель
Ex_Product - исключение
Config, Core и т.п. - куча разных полезных классов, лежащих в /library/
И автолоадер выглядит примерно так:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function autoload($class)
{
    // Контроллер
    if(mb_substr($class, 0, 2) === 'C_')
        $dir = Config::Get('dir_c');
 
    // Модель
    elseif(mb_substr($class, 0, 2) === 'M_')
        $dir = Config::Get('dir_m');
 
    // Исключение
    elseif(mb_substr($class, 0, 3) === 'Ex_')
        $dir = Config::Get('dir_ex');
 
    // Библиотечный класс
    else
        $dir = Config::Get('dir_library');
 
    $file_path = $dir . $class. '.php';
 
    if(file_exists($file_path))
        require_once($file_path);
}
1
21 / 21 / 6
Регистрация: 12.12.2010
Сообщений: 677
02.08.2016, 13:38  [ТС] 14
Lord_Voodoo, отлично сказано! Я с Вами полностью согласен!) Именно такой поддержки я и ждал И, между прочим.. Всё равно, то что я пишу - работает, и пока с проблемами в своём коде я толком не сталкивался..Глобальными.. Разве что временами слышу от людей фразы что код кривой, без обьяснения сути)) Да код можно совершенствовать сколько угодно, идеального в этом мире ничего нету.. Поэтому..И правда, выше нос! Главное - стремление!

Добавлено через 14 минут
Jodah, классный пример! Спасибо большое! Сейчас ещё раз перепрочитаю, и, начну свой движок переписывать с нуля! У меня правда ещё небольшой вопрос. Я в качестве шаблонизатора пишу *.tpl файлы, а в нём находится у меня допустим такой код:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html lang="ru">
    <head>
        <meta charset="utf8">
        <link rel="shortcut icon" href="/media/img/favicon.ico"></link>
        <title>%TITLE%</title>
        <link rel="stylesheet" href="media/css/main.css">
        <link rel="stylesheet" href="media/css/pages.css">
        <script src="media/js/jquery-3.1.0.min.js"></script>
        <script src="media/js/design.js"></script>
    </head>
    <body>
        %CONTENT%
    </body>
</html>
И получается, я потом при помощи файла в core/class_templater.tpl - заменяю %TITLE% на сгенерированный заголовок с контроллера, а %CONTENT% - сгенерированный(вытащенный образно говоря) контент. Хорошо ли это решение? Просто у меня теперь все проекты делаются по такой основе

Добавлено через 6 минут
Цитата Сообщение от Jodah Посмотреть сообщение
$dir = Config::Get('dir_library');
Я так понял это вызов из статического класса Config метода Get.. А что он сделает?
0
Эксперт PHP
2980 / 2501 / 1179
Регистрация: 14.05.2014
Сообщений: 7,065
Записей в блоге: 1
02.08.2016, 13:50 15
Цитата Сообщение от Linked Посмотреть сообщение
Я так понял это вызов из статического класса Config метода Get
Это вызов статического метода Get из класса Config.
1
21 / 21 / 6
Регистрация: 12.12.2010
Сообщений: 677
02.08.2016, 14:05  [ТС] 16
Kerry_Jr, точно, тупанул я)
А ещё вопрос:
Вот я для работы с БД использую класс "core_db.php". Он с точки зрения правильности - хорошо написан?
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
class DB {
    private $conf;
    private $db;
    private $result;
    
    function __construct() {
        $this->conf = new CONFIGS();
        $this->db = new mysqli($this->conf->host, $this->conf->user, $this->conf->pass, $this->conf->name_db);
        if(!$this->db) {
            printf("Невозможно подключиться к базе данных. Код ошибки: %s\n", $this->db->connect_error);
            exit();
        } else {
            $this->db->query("SET NAMES utf-8");
            $this->db->query("SET character_set_client='utf-8'");
            $this->db->query("SET character_set_results='utf-8'");
            $this->db->query("SET collation_connection='utf-8'");
        }
    }
    
    function DQ($query_string) {
        $this->result = $this->db->query($query_string);
        return $this->result;
    }
    
    function DF($query_string) {
        $this->result = mysqli_fetch_assoc($query_string);
        return $this->result;
    }
    
    function DN($query_string) {
        $this->result = mysqli_num_rows($query_string);
        return $this->result;
    }
    
    function __destruct() {
        mysqli_close($this->db);
    }
}
Добавлено через 11 минут
Jodah, вот я написал класс загрузчика файлов ядра и контроллеров (Впринципе мне это только нужно будет).Я так понял нужно будет аргументами автозагрузки передавать названия файлов ядра которые мне нужны и контроллеров (например из ЧПУ)?
Вот сам код который получился:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
class Loader {
    function autoload_core($name_core) {
        $file_core = 'app/core/core_'.$name_core.'.php';
        if(file_exists($file_core)) {
            require_once($file_core);
            $obj_core = new $name_core();
        }
        else die("Error 404");
        return $obj_core;
    }
    
    function autoload_controller($name_controller) {
        $file_controller = 'app/controllers/controller_'.$name_controller.'.php';
        if(file_exists($file_controller)) {
                require_once($file_controller);
                $obj_controller = new $name_controller();
        } else die("Error 404");
        return $obj_controller;
    }
}
Конечно, я кажется что то не учёл, т.к. насколько знаю суть автозагрузчика заключается в том, что бы автоматически подгружать нужные классы, а не получать их названия в аргументах а после чего подгружать(
0
Эксперт PHP
3572 / 2993 / 1258
Регистрация: 01.08.2012
Сообщений: 10,255
02.08.2016, 14:23 17
Лучший ответ Сообщение было отмечено Linked как решение

Решение

Цитата Сообщение от Linked Посмотреть сообщение
А что он сделает?
Возвращает полный путь к папке. Часто для этого используют константы, DIR_C - путь к папке с контроллерами, и т.п., мне больше нравится получать эти пути через класс Config.
Цитата Сообщение от Linked Посмотреть сообщение
Хорошо ли это решение?
А оно поддерживает всякие IF, FOREACH и т.п.?
Лично я пока не вижу смысла использовать шаблонизаторы. В моём понимании они делают тоже самое, что и PHP, только через свой собственный синтаксис.

Добавлено через 8 минут
Цитата Сообщение от Linked Посмотреть сообщение
$this->conf = new CONFIGS();
А зачем $this? Можно просто в переменную $conf сохранить, если больше нигде не приходится.

Цитата Сообщение от Linked Посмотреть сообщение
PHP
1
2
$this->result = $this->db->query($query_string);
* * * * return $this->result;
Опять же, зачем $this? И можно сократить до:
PHP
1
return $this->db->query($query_string);
PHP
1
2
3
4
    function DF($query_string) {
        $this->result = mysqli_fetch_assoc($query_string);
        return $this->result;
    }
А почему query_string? Сюда же ресурс должен подставляться, а не sql-запрос. И почему процедурный стиль? У вас же есть объект $this->db, у него и нужно вызывать fetch_assoc.

Добавлено через 3 минуты
Цитата Сообщение от Linked Посмотреть сообщение
суть автозагрузчика заключается в том, что бы автоматически подгружать нужные классы
Верно.

Когда вы пытаетесь обратиться к несуществующему классу, например new ROUTER(), функция автолоадер запускается автоматически, а в переменную $class попадает само название 'ROUTER'.

Создавать объекты внутри лоадера не нужно. Нужно только подключить файл с нужным классом, если он существует.
1
21 / 21 / 6
Регистрация: 12.12.2010
Сообщений: 677
02.08.2016, 15:17  [ТС] 18
Jodah, ну суть в том, что я раньше создавал в каждом контроллере в начале что то вроде:
PHP
1
private $obj_db;
А внутри функции которая возвращает данные делал всякие вроде:
PHP
1
2
3
$this->obj_db = new DB();
$result = $this->obj_db->DQ("SELECT...");
$f_result = $this->obj_db->DF($result);
и т.д. И я решил что бы в каждом контроллере что бы не обьявлять всякие левые свойства с работой БД, параметры, акшены (ЧПУ, откуда я и выбираю какой контроллер подключать) - подключить в одном месте, создать обьекты в нужном месте, а в контроллерах их просто уже использовать..

Добавлено через 46 минут
Jodah, и ещё вопрос: т.е. я могу всё это
PHP
1
2
3
4
5
6
7
8
9
    function DF($query_string) {
        $this->result = mysqli_fetch_assoc($query_string);
        return $this->result;
    }
    
    function DN($query_string) {
        $this->result = mysqli_num_rows($query_string);
        return $this->result;
    }
сократить вот так?
PHP
1
2
3
4
5
6
7
    function DF($query_string) {
        return $this->db->fetch_assoc($query_string);
    }
    
    function DN($query_string) {
        return $this->db->num_rows($query_string);
    }
0
Эксперт PHP
3572 / 2993 / 1258
Регистрация: 01.08.2012
Сообщений: 10,255
02.08.2016, 15:19 19
Цитата Сообщение от Linked Посмотреть сообщение
сократить вот так?
Да, только $query_string замените на $resource или как-то ещё, чтобы название отражало данные.
1
21 / 21 / 6
Регистрация: 12.12.2010
Сообщений: 677
02.08.2016, 15:45  [ТС] 20
Jodah, спасибо! Так и сделал) Буду теперь с автозагрузчиком играться)

Добавлено через 4 минуты
Jodah, Fatal error: Call to undefined method mysqli::fetch_assoc() in /public_html/application/core/class_db.php on line 19
Выдаёт ошибку(
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.08.2016, 15:45

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь или здесь.

Может тут кто подскажет... :)
Доброго времени суток. Отдыхал тут на работе, и вдруг поступил звонок. Позвонила подруга, и...

Может кто подскажет решение
Язык для меня не особо нужный но учить заставляют. Кто поможет? Отметьте корректные реализации...

Как писать красивый код?
Здравствуйте, написал код для 5 свойств контрола и смотрю как то так громаздко на экране. Вот...

Как писать красивый код?
Добрый день! В python есть хороший свод рекомендаций по написанию кода PEP-8 (мб кто слышал). Есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.