class Config {
protected static array $register = [];
public static function get(string $name, $default = null) {
$keys = explode('.', $name);
$pointer = self::$register;
foreach ($keys as $key) {
if (!array_key_exists($key, $pointer)) {
/*Если ключа нет, выставить его*/
//self::set($name, $default);
/*Бросить исключение*/
//throw new Exception("No such key: {$name}");
/*Вернуть значение по умолчанию*/
return $default;
}
$pointer = &$pointer[$key];
}
return $pointer;
}
public static function set(string $name, $value = null) {
$arr = &self::$register;
$keys = explode('.', $name);
foreach ($keys as $key) {
$arr = &$arr[$key];
}
if (is_array($arr) && is_array($value)) {
$arr = array_replace_recursive($arr, $value);
} else {
$arr = $value;
}
}
public static function getTree() {
return self::$register;
}
}
Config::set("config", [
"name" => "test",
]);
print_r(Config::get("config"));
echo "(config)\n\n";
Config::set("config.class.name", "A");
print_r(Config::get("config.class.name"));
echo "\n(config.class.name)\n\n";
Config::set("config", [
"class" => [
"test" => "B",
],
]);
print_r(Config::get("config.class"));
echo "\n(config.class)\n\n";
Config::set("config.class", null);
print_r(Config::get("config.class"));
echo "\n(config.class)\n\n";
print_r(Config::get("config.fake.key.without.value", "UNDEFINED"));
echo "\n(config.fake.key.without.value)\n\n";
Config::set("config.nullable", null);
print_r(Config::get("config.nullable", "NULL"));
echo "\n(config.nullable)\n\n";
print_r(Config::getTree());
echo "\n(all)\n";
interface D {
public function execute();
}
class B implements D {
public function execute() {
return "This is B";
}
}
class C implements D {
public function execute() {
return "This is C";
}
}
class A {
public function __construct(D $class = null) {
if (!is_null($class)) {
echo $class->execute();
}
}
}
new A();
new A(new B());
new A(new C());
можно "сломать" файл и хэш при этом не изменится
Стандарт Cross-Origin Resource Sharing работает с помощью добавления новых HTTP-заголовков, которые позволяют серверам описывать набор источников, которым разрешено читать информацию, запрашиваемую web-браузером. В частности, для методов HTTP-запросов, которые могут привести к побочным эффектам над данными сервера (в частности, для HTTP методов, отличных от GET или для POST запросов, использующих определнные MIME-типы), спецификация требует, чтобы браузеры "предпроверяли" запрос, запрашивая поддерживающие методы с сервера с помощью метода HTTP-запроса OPTIONS и затем, поверх "подтверждения" с сервера, отсылали фактический запрос с фактическим методом HTTP-запроса
$query = "SELECT
t1.AdId,
t1.City
FROM butuzLOCAL.product AS t1
JOIN statistic.user_2 AS t2 ON t1.AdId = t2.AdId
WHERE t2.date = :dttm";
$results = Yii::$app->db
->createCommand($query)
->bindValues([
'dttm'=>'2019-11-12'
])
->queryAll();
<?php
if ($_POST) {
die(json_encode([$_POST, $_FILES]));
}
?>
<form enctype="multipart/form-data" method="POST">
<input type="text" name="name" required></br>
<input type="file" name="file[]" multiple style="margin-bottom: 5px;">
<input type="submit" name="gsubmit" value="Отправить"></br>
</form>
<script>
document.querySelector("form").addEventListener("submit", function(e) {
let form = e.target;
e.preventDefault();
e.stopImmediatePropagation();
let xhr = new XMLHttpRequest();
xhr.open(form.method, form.action);
xhr.onreadystatechange = function(result) {
if (xhr.readyState === 4 && xhr.status === 200) {
let responseData = JSON.parse(xhr.responseText);
console.log(responseData);
}
};
xhr.send(new FormData(form));
}, true);
</script>