Есть ли сейчас смысл в оттачивании чистого PHPЯзык всегда первичен. Да.
если мне +- хватает понимания, как работает та же Ларавел?Ты серьезно думаешь, что у тебя "хватает понимания", как работает фреймворк? Больше не повторяй вслух эти слова. Никогда. Особенно на собеседовании. Иначе собеседующие тебя похоронят за плинтусом.
Может, при возможности стоит обратить внимание на другой язык(Го, шарп, нода)?Сегодня разговаривал с HR-ом, дословно: php-шников и фронтов много. Больше остальных. Спрос на другие языки - go и питон - там низкая конкуренция. Не могу ей не поверить, т.к. php существует более 20 лет и за это время в отрасль вкатилась куча людей. Откровенно говоря, очень скоро значительный % пхп-макак пойдет в такси, включая меня. Конкуренция, судя по собеседованиям - адовая. Спрашивают сам язык и ещё 250 сопутствующих технологий.
не рискую пока идти на собеседования потому что хочу закрыть чеклист: несколько проектов в портфолио на чистом PHP, laravel; подучить JS с Аяксом; Добить тестирование, а также чуть разобраться с докером, линуксом и теоретической частью этих ваших интернетов.мертвому припарка. Ты никогда в "домашних условиях" не получишь боевой опыт. Лучше иди работай за "ничего", больше пользы будет.
Если я сделаю, условно, 10 таких одинаковых проектов, будет ли от этого толк больше, чем от 10 аналогичных проектов на Ларавел?Не будет.
который просто будет писаться заново каждый раз с какими-нибудь косметическими (и не очень) изменениямиЭто у тебя будет одной из самых сложных задач - поддержка актуальности. Твое решение будет глобально переписано минимум 125 раз, тебе необходимо будет делать приложение отдельным композер-пакетом-зависимостью, это усложнит абсолютно весь процесс и ты просто не напишешь эти 10 сайтов. Никогда.
class Checker
{
/**
* @var mixed
*/
protected mixed $value;
/**
* @var int
*/
protected int $minimalValue = 0;
/**
* @var array
*/
protected array $excludeValues = [];
/**
* Checker constructor.
* @param mixed $value
*/
public function __construct(mixed $value)
{
return $this->checkValue($value, function() use ($value) {
$this->value = $value;
return $this;
});
}
/**
* @param mixed $value
* @return $this
*/
public function setMinimalValue(mixed $value): self
{
return $this->checkValue($value, function() use ($value) {
$this->minimalValue = $value;
return $this;
});
}
/**
* @param mixed $value
* @return $this
*/
public function setExcludeValue(mixed $value): self
{
return $this->checkValue($value, function() use ($value) {
if (!array_search($value, $this->excludeValues)) {
array_push($this->excludeValues, $value);
}
return $this;
});
}
/**
* @return bool
*/
public function validate(): bool
{
return $this->value > $this->minimalValue && !in_array($this->value, $this->excludeValues);
}
/**
* @param mixed $value
* @param callable $callable
* @return $this
*/
protected function checkValue(mixed $value, callable $callable): self
{
if (!$this->isInteger($value)) {
throw new \RuntimeException("Value `$value` is not integer");
}
return $callable($this);
}
/**
* @param mixed $val
* @return bool
*/
protected function isInteger(mixed $val): bool
{
if (!is_scalar($val) || is_bool($val)) {
return false;
}
return $this->isFloat($val)
? false
: preg_match('~^((?:\+|-)?[0-9]+)$~', $val) === 1;
}
/**
* @param mixed $val
* @return bool
*/
protected function isFloat(mixed $val): bool
{
if (!is_scalar($val) || is_bool($val)) {
return false;
}
$type = gettype($val);
if ($type === "double") {
return true;
} else {
return preg_match("/^([+-]*\\d+)*\\.(\\d+)*$/", $val) === 1;
}
}
}
try {
echo (int) (new Checker('5'))
->setMinimalValue(4)
->setExcludeValue(107)
->setExcludeValue(107)
->setExcludeValue(108)
->validate();
} catch (\Exception $e) {
echo $e->getMessage();
}
Как константы работают при наследовании?ну типа да, на то оно и наследование.
Константы импортируются в классы потомки?
function getModificationTime($path_to_file)
{
return (new Datetime())->setTimestamp(filemtime('/my/style/paths/' . $path_to_file));
}
$modify_date = getModificationTime('styles.css');
/**
* Возвращает true, если дата (обычно документа) $data является устаревшей
* по отношению к HTTP заголовку If-Modified-Since.
*
* @param $date \DateTime
* @return bool
*/
public static function IfModifiedSince(\DateTime $date): bool
{
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
$if_modified_since = strtotime(substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 5));
if ($if_modified_since && $if_modified_since >= $date->getTimestamp()) {
return false;
}
}
return true;
}
class foo {
public function getData() {
return [
'key' -> $object->id,
// ....
];
}
}
CREATE TABLE `test` (
`name` varchar(255) NOT NULL,
`date_int` int(11) UNSIGNED NOT NULL,
`date_time` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `test`
ADD KEY `date_int` (`date_int`),
ADD KEY `date_time` (`date_time`);
COMMIT;
SELECT * FROM `test` WHERE date_int = UNIX_TIMESTAMP('1970-01-03 12:12:12')
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE test ref date_int date_int 4 const 2 NULL
EXPLAIN SELECT * FROM `test` WHERE date_time = '1970-01-03 12:12:12'
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE test ref date_time date_time 5 const 2 NULL
require_once $_SERVER['DOCUMENT_ROOT'] . '/vendor/autoload.php';
define('DOCUMENTROOT_PATH', dirname(dirname(__FILE__)));
// index.php
include '. /config/constatnts.php';
echo DOCUMENTROOT_PATH; // правильный doc root
$arr = include "inc/routes.php";
$arr = include "inc/routes.php";
$router = new Router($arr);
// или
$router->setRoutes($arr);
$routs = '#^'.$routs.'$#';
spl_autoload_register() Есть и исправно работает.
$path = 'inc/classes/'.ucfirst($this->params['controller']);
{
"name": "vendorname/myfirstgovnokod",
"require": {},
"autoload": {
"psr-4": {
"Govnokod\\": "src"
}
}
}
<?php
namespace Govnokod;
class Test
{
}
<?php
include 'vendor/autoload.php';
use Govnokod\Test;
$test = new Test();
print_r($test);
$file = '/g/g/g/g/';
if (!@unlink($file) && file_exists($file)) {
throw new \RuntimeException('Failed to delete file ' . $file);
}
Warning: unlink(/g/g/g/g/): No such file or directory in
Я понимаю про SOLID там, но если следовать правилу единой ответсвенности, то файлов будет просто целая гора,да. так оно и и будет
Также встает вопрос, например, у меня сейчас маршрутизация а-ля микрофреймворк, чтобы прикрутить MVC надо реализовывать поиск контроллера и вызов метода. Должен ли этим заниматься отдельный класс?не надо спрашивать такие вопросы. Если ты что-то пишешь, то должен быть уверен в правильности своей архитектуры. Иначе ты на каждый чих будешь вопрос задавать.
Пишу небольшой фреймворк для себя в образовательных целяхв целом идея абсолютно глупая, вредная и приведет тебя только к выгоранию. Ибо по сути ты будешь бесплатно работать, что-то делать, а толку не будет. Я сам писал фреймворк несколько лет в свободное время, написал, но лучше тебе потратить это всё на изучение того, что сейчас есть и сделать конечный продукт - будет больше пользы. Плюс опыт работы на актуальном инструменте в карму.