Но тут надо понимать, что всё это работает только при правильном применении ООП. А точнее просто при применении ООП. Потому что 98% "ООП" кода, который пишется на РНР - это голимая процедурщина, даже если она обёрнута в классы и методы. Если у тебя метод класса представляет из себя стену кода, которую ты тупо перенёс из файла, инклюдившегося в любимое похапешное спагетти - то это не ООП. Это та же процедурщина, вид сбоку. И смысл использования dependency injection ты с ним не почуствуешь. Будешь конечно применять, но в качестве карго культа - потому что тебе это на тостере написали.
А вот когда твой код начнет становиться действительно объектным - тогда стразу станет понятнее.
$openingHours = [
['day' => 'monday', 'time' => '08:00-20:00'],
['day' => 'tuesday', 'time' => '08:00-20:00'],
['day' => 'wednesday', 'time' => '08:00-20:00'],
['day' => 'thursday', 'time' => '10:00-20:00'],
['day' => 'friday', 'time' => '10:00-18:00'],
['day' => 'saturday', 'time' => '10:00-16:00'],
['day' => 'sunday', 'time' => '10:00-16:00'],
];
$temp = array();
$result = array();
foreach($openingHours as $key => $item) {
$temp[$item['time']][] = $item['day'];
}
foreach($temp as $key => $item){
$count = count($item) -1;
$count >= 1 ? $result[$item[0].'-'.$item[$count]] = $key : $result[$item[0]] = $key;
}
print_r($result);
Array
(
[monday-wednesday] => 08:00-20:00
[thursday] => 10:00-20:00
[friday] => 10:00-18:00
[saturday-sunday] => 10:00-16:00
)
$openingHours = [
['day' => 'monday', 'time' => '08:00-20:00'],
['day' => 'tuesday', 'time' => '08:00-20:00'],
['day' => 'wednesday', 'time' => '08:00-23:59'],
['day' => 'thursday', 'time' => '08:00-20:00'],
['day' => 'friday', 'time' => '08:00-20:00'],
['day' => 'saturday', 'time' => '10:00-16:00'],
['day' => 'sunday', 'time' => '10:00-16:00'],
];
$result = $active = [];
$openingHours[] = ['day' => '', 'time' => '']; // empty value to simplify code
foreach ($openingHours as $openingHour) {
if ($active) {
if ($active['time'] === $openingHour['time']) {
$active['end'] = $openingHour['day'];
} else {
$key = $active['end'] ? $active['start'] . '-' . $active['end'] : $active['start'];
$result[$key] = $active['time'];
$active = [];
}
}
$active = $active ?: [
'time' => $openingHour['time'],
'start' => $openingHour['day'],
'end' => null,
];
}
print_r($result);
function foo()//учел правильную критику Дениса Ишенина с наименованиями
{
console.log(this);
}
class Window{
public ... Foo(...)
}
...
foo();
...
var foo = {
someFunc: function(){
...
function innerFunction(){
console.log(this);
}
innerFunction();
}
}
function foo()
{
console.log(this);
}
function Window.foo()//учел правильную критику Дениса Ишенина с наименованиями
{
console.log(this);
}
, var foo = {
someFunc: function(){
...
function innerFunction(){
console.log(this);
}
innerFunction();
}
}
var foo = {
someFunc: function(){
...
function Window.innerFunction(){
Window.console.log(this);
}
Window.innerFunction();
}
}
1. Для чего замыкание существуют?Для инкапсуляции данных.
2. В каких условиях они создаются?Когда вложенная функция обращается к переменным внешней функции.
// makeCounter - внешняя функция
function makeCounter(initialValue) {
var value = +initialValue || 0;
// counter - внутренняя функция
// она использует переменную value из внешней функции
// что-бы это было возможным, для counter создается замыкание,
// в котором хранится переменная value
// переменная initialValue функции counter не нужна, поэтому ее можно "забыть"
return function counter() {
return value++;
};
}
// у нас 3 экземпляра функции counter
var counter1 = makeCounter();
var counter2 = makeCounter();
var counter3 = makeCounter(100);
// и для каждой есть своя переменная value
console.log(counter1()); // 0
console.log(counter1()); // 1
console.log(counter2()); // 0
console.log(counter1()); // 2
console.log(counter3()); // 100
// а вот получить как-то напрямую переменную value мы не можем
// инкапсуляция нам не дает поломать данные
// Загружаем кашерный файл
LOAD DATA LOCAL INFILE '/srv/cms_cpa/files/adimport_items.csv' INTO TABLE adimport_tmp CHARACTER SET utf8 FIELDS TERMINATED BY '|' ENCLOSED BY "'" LINES TERMINATED BY '\n' IGNORE 1 LINES (id_adimport,article,available,currencyId,delivery,description,id,name,oldprice,param,picture,price,url,vendor,advcampaign_id,advcampaign_name);
// Загружаем только нужные поля (!!!)
LOAD DATA LOCAL INFILE '/srv/cms_cpa/files/adimport_items.csv' INTO TABLE adimport_tmp CHARACTER SET utf8 FIELDS TERMINATED BY '|' ENCLOSED BY "'" LINES TERMINATED BY '\n' IGNORE 1 LINES (id_adimport,@ISBN,@adult,@age,article,@attrs,@author,available,@barcode,@binding,@brand,@categoryId,@country_of_origin,currencyId,delivery,description,@downloadable,@format,@gender,id,@local_delivery_cost,@manufacturer_warranty,@market_category,@model,@modified_time,name,oldprice,@orderingTime,@page_extent,param,@performed_by,@pickup,picture,price,@publisher,@sales_notes,@series,@store,@syns,@topseller,@type,@typePrefix,url,vendor,@vendorCode,@weight,@year,advcampaign_id,advcampaign_name,@deeplink);
// Все поля
LOAD DATA LOCAL INFILE '/srv/cms_cpa/files/adimport_items.csv' INTO TABLE adimport_tmp CHARACTER SET utf8 FIELDS TERMINATED BY '|' ENCLOSED BY "'" LINES TERMINATED BY '\n' IGNORE 1 LINES (id_adimport,ISBN,adult,age,article,attrs,author,available,barcode,binding,brand,categoryId,country_of_origin,currencyId,delivery,description,downloadable,format,gender,id,local_delivery_cost,manufacturer_warranty,market_category,model,modified_time,name,oldprice,orderingTime,page_extent,param,performed_by,pickup,picture,price,publisher,sales_notes,series,store,syns,topseller,type,typePrefix,url,vendor,vendorCode,weight,year,advcampaign_id,advcampaign_name,deeplink);