// где-то в дебрях класса App
self::$db = require_once 'config/db.php';
// КАК ИСПОЛЬЗОВАТЬ?
// 1
$db = App::$db;
self::$instance = new PDO($db['dsn'], $db['username'], $db['passwd'], $db['options']);
// 2
self::$instance = new PDO(App::$db['dsn'], App::$db['username'], App::$db['passwd'], App::$db['options']);
<?php
namespace core;
use PDO;
class Db
{
public static $count_instances = 0;
public static $count_sql = 0;
public static $queries = [];
private static $instance;
private function __construct()
{
// $db = require_once 'config/db.php'; избавляемся от инклуда в этом месте
self::$instance = new PDO(App::$db['dsn'], App::$db['username'], App::$db['passwd'], App::$db['options']);
}
public static function pdo($sql, $params = [], $class = 'stdClass')
{
return self::exec($sql, $params)->fetchAll(PDO::FETCH_CLASS, $class);
}
public static function exec($sql, $params = [])
{
self::$count_sql++;
self::$queries[] = $sql;
$stmt = self::getInstance()->prepare($sql);
$stmt->execute($params);
return $stmt;
}
private static function getInstance()
{
if (!self::$instance) {
self::$count_instances++;
new self();
}
return self::$instance;
}
public static function getLastInsertId()
{
return self::getInstance()->lastInsertId();
}
public static function getServerVersion()
{
return self::getInstance()->getAttribute(PDO::ATTR_SERVER_VERSION);
}
}
Какие еще "константы"? Для чего? Что ты собрался с ними делать?
<?php
namespace core;
use Error;
class App extends Error
{
public static $debug;
public static $routes = [];
public static $db = [];
public static $name = 'Название';
public static $title = 'Описание';
public static function run($true_false)
{
if (is_bool($true_false)) {
session_start();
self::$debug = $true_false ? false : true;
Debug::run();
self::$routes = require_once 'config/routes.php';
self::$db = require_once 'config/db.php';
Router::run();
} else {
die('Ошибка запуска!');
}
}
}
<?php
use core\App;
chdir(dirname(__DIR__));
spl_autoload_register(function ($class) {
$file = str_replace('\\', '/', $class) . '.php';
if (is_file($file)) {
require_once $file;
}
});
App::run(false); // false - dev, true - prod
где выполнение нескольких подготовленных запросов?
class App extends Error
// та-тах
throw new App('Вы не ввели или неправильно ввели данные');
// та-тах
try {
// сюда метод с выбросом
} catch (App $app) {
echo $app->getMessage();
}
установил бы какой-либо из популярных фреймворков
class App extends Error - На человеческий переводится как мой App сплошной Error.
установил бы какой-либо из популярных фреймворков
тяжёлые, про фалкон читал, но не вникал сильно
App это разновидность Error
что за класс AppException?
class AppException extends Error{} // всё, это весь класс
public function __construct($message = "", $code = 0, Throwable $previous = null)
{
parent::__construct($message, $code, $previous);
}
Тяжелые, потому что так говорят?
App это разновидность Error?
именно так, он также используется для реализации интерфейса Throwable
любой голый фреймворк генерит у меня страницу примерно 0.1 сек, у меня авторизованный скрипт с примерно около десятка запросов генерит страницу за 0.005, да мне и не нужен фв на 50 мегабайт, у меня скрипт весь с графикой около 5-ти мег
У вас App базовый класс в точке входа, он устанавливает коннект к БД, причем здесь Error?
пока ваш скрипт ничего не делает, разница огромна
в фреймворках можно почерпнуть правильные подходы
Полагаю, что сообщество.
Или вы серьёзно считаете что куча людей всё это время ошибались, а тут появились вы, на вас снизошло озарение и только вы теперь обладаете сакральным знанием?
Application - это application, а исключения - это исключения.
если вы игнорируете любые советы?
App::run(); // запустил скрипт
var_dump(new App()); // не вижу в распечатке ни одного своего статического свойства и метода
<?php
namespace app\models;
use core\App;
use core\base\Model;
class VeteranRiddle extends Model
{
public $number;
public $last_number;
public $last_winner;
public $prize;
public function handler(User $user, $number)
{
if (!preg_match('~^[1-9]\d{8}$~', $number)) {
throw new App('Вы не ввели или неправильно ввели данные');
}
if ($number != $this->number) {
if (!$this->last_number) {
$this->last_number = $number;
$this->save();
throw new App('Вы не угадали, но ввели ближайшее число');
}
if ($number == $this->last_number) {
throw new App('Вы не угадали, но повторили ближайшее число');
}
if (abs($number - $this->number) < abs($this->last_number - $this->number)) {
$this->last_number = $number;
$this->save();
throw new App('Вы не угадали, но ввели новое ближайшее число');
}
throw new App('Вы не угадали, попробуйте ещё раз');
}
$this->number = mt_rand(100000000, 999999999);
$this->last_number = null;
$this->last_winner = $user->login;
$this->save();
$user->gold += $this->prize;
}
}
<?php
namespace app\controllers;
use app\models\VeteranRiddle;
use core\App;
class ClubController extends AppController
{
public function __construct($route)
{
parent::__construct($route);
$this->userArea();
}
public function indexAction()
{
$this->setTitle('Клуб офицеров');
$user = $this->user->getAfter();
$this->setVars(compact('user'));
}
public function veteranRiddleAction()
{
try {
$veteran_riddle = VeteranRiddle::findOne(1);
if ($this->formButton('veteran_riddle')) {
$number = filter_input(INPUT_POST, 'number');
$veteran_riddle->handler($this->user, $number);
$prize = $this->numericDeclension($veteran_riddle->prize, ['золото', 'золота', 'золота']);
$this->alert('success', 'Вы угадали число и получили ' . $prize);
}
} catch (App $app) {
$this->alert('danger', $app->getMessage());
}
$this->setTitle('Клуб офицеров: Загадка ветерана');
$user = $this->user->getAfter();
$this->setVars(compact('user', 'veteran_riddle'));
}
}