Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Сейчас <?=date('Y')?> год
WP отличная штука
ShopOrderProducts.find(params[:id])
ShopOrderProducts.find(params[:id])ShopOrderProducts::find($params->id)
Я кстате и не спорю, что в php тоже есть хорошие решения, беда в том, что вы первый человек в этом треде, который говорит об этом ;)
# create makes the resource immediately
@post = Post.create(
:title => "My first DataMapper post",
:body => "A lot of text ...",
:created_at => Time.now
)
# Or new gives you it back unsaved, for more operations
@post = Post.new(:title => ..., ...)
@post.save # persist the resource
class ShopOrderProductsTable extends AbstractTable {
protected $tableName = 'shop_orders_products';
public function findByOrderId ($id) {
return $this->find(['order_id' => $id]);
}
Но я не понимаю зачем нужны __callStatic и прочее метапрограммирование для использования ActiveRecord? Наследования вполне достаточно. В базовом классе универсальный метод поиска, в наследниках — конкретные ради соблюдения DRY и инакпсуляции, которые вызывают универсальный базового
$item->parent->id или $item->id->parent?ON author.user_id = user.id
выглядит, имхо, лучше чем ON author.id_user = user.id
— глаз не спотыкается на id, идёт последовательное уточнение согласно иерархии предметной области.SELECT id_user, name_user удобнее чем SELECT user_id, user_name?Расширить или изменить базовую функциональность (пускай даже с учетом сторонних модулей) — нужно писать php-код

Subclasses cannot override private methods. Subclass overrides of public methods can’t even see, let alone call, the superclass’s private methods. Problematic for, say, test mocks.
$class = new ReflectionClass ($myClass);
$method = $class->getMethod ('privateMethodX');
$method->setAccessible(true);
$output = $method->invoke ($myClass, $arg1, $arg2);
echo "Hello" и echo("Hello"). Тогда уж надо допускать вызов функций без скобок и разбираться с неоднозначимостями типа вложенных вызовов.
Используйте фоновые процессы, cron скрипты и т.д.
<?
// готовим и отдаем пользователю http отчет
fastcgi_finish_request();
// отправка почты или другой долгоживущий процесс
<?php if($someting !== ''): ?>
<div class="info"><?php echo $someting ?></div>
<?php endif ?>
<?php if($someting !== ''){ ?>
<div class="info"><?php echo $someting ?></div>
<?php } ?>
echo "4.2" == "4.20";var_dump ("4.2" == true); // true
var_dump ("4.2" === "4.20"); // false
$ curl -L get.rvm.io | bash -s stable
bundle install. Не надо никаких архивов, что-то качать, ставить руками и т.д. По сложности аналогично apt-get имхо. $a = 23
$a_request = (int) $_POST['a']
echo $a_request === $a // 1$a = 23
$a_request = $_POST['a']
echo $a_request == $a // 1Я просто не понимаю зачем две строки приводить к float
а самому явно нельзя их привести к float или к какому-нибудь другому денежнему типу данных? больше магии! Всякой разной!
(float). Не нравится? Лениво изучать правила приведения типов при сравнении, которые кажутся очевидными любому человеку, который про «ваши» типы и не слышал ни разу? Пользуйтесь строго типизированными языками. А уж если решили воспользоваться слаботипизированными (да даже сильно), то будьте добры изучить нюансы типизации. По-моему это очевидно для любого, кто знает о существовании различных типов типизации.Цикл жизни приложения от запроса к запросу.
намного логичнее написать приложение конкретно под заказчика
protected function isAllowedKey ($key) {
return $key[0] != '_';
}
public function filterArray (array $array) {
$result = array();
foreach ($array as $key => $value) {
if ($this->isAllowedKey($key)) {
$result[$key] = $array[$key];
}
}
return $result;
}
return array_filter( $array, function ($item) {
return !$item->is_hidden;
});
return array.filter(function (item) {
return !item.isHidden;
});
array.filter (item) -> !item.isHidden
function array_filter_keys ($array, $callback) {
$result = array();
foreach ($array as $key => $value) {
if ($callback($key, $value) !== false) $result[$key] = $value;
}
return $result;
}
// result:
return array_filter_keys( $source, function ($item) {
return $item[0] !== '_';
});
private static function filterPrivateKeys($attrs) {
return array_intersect_key(
$attrs,
array_flip(
array_filter(
array_keys($attrs),
function ($item) {
return substr($item, 0 ,1) !== '_';
}
)
)
);
}
$sum = 0;
foreach($array as $value) {
$sum += $value;
}
$sum = array_reduce($array, function($sum, $value) {
$sum += $value;
return $sum;
}, 0)
return $sum + $value; — опять же неочевидность, достаточно ли там чистой функции, а может возвращаемое значение не нужно, а по документации не понятно. function filter_array($item, $key, &$arr){ if($key[0]==='_') unset($arr[$key]);}
array_walk(&$a,'filter_array', &$a);
Dictionary<string, string> dict = new Dictionary<string, string>();
/*
fill
*/
dict = dict.Where(a => a.Key[0] != '_').ToDictionary(a => a.Key, a=> a.Value);
$result= array();
foreach($hash as $k => $v) if($k[0] == '_') $result[$k] = $v;
my %result;
for (keys %hash) {
$result{$_} = $hash{$_} if /^_/;
}
foreach($array as &$_) {
}
... if /^_/;
%result = map { $_ => $hash{$_} } grep !/^_/, keys %hash
А во вложенном цикле $_ куда будет ссылаться?
PHP — отстой! Но я люблю его!