Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
new StockData("Perch", 50, "2012-02-02 05:23:32")<?php
use function \myCoolApp\array\{map, reduce, last};
function makeSomethingUseful(array $collection) {
return reduce(
map($collection, function($item) {
// do something
return $item;
}),
function ($result, $item) {
return $result + $item;
}
);
}статические методы это обычные функции привязанные к контексту каких-то объектов, они обозначают что мол «я функция которая позволяет вам что-то сделать с объектами этого типа».
Так как статические методы вызываются без создания экземпляра класса, то псевдо-переменная $this не доступна внутри метода, объявленного статическим.
Так вот, что я хотел сказать-то. Класс и его статические методы можно представить себе как синглетон, который в общем случае может быть оправдан, а может быть натягиванем совы на глобус
class psevdoDb {
private $_connect = null;
private function __constructor() {
}
public function getConnect() {
if(!is_null($this->_connect)) {
return $this->_connect;
}
$this->_connect = new PDO('bla bla bla');
return $this->_connect;
}
}class psevdoDb {
private static $_connect = null;
private function __constructor() {
}
public static function getConnect() {
if(!is_null(self::$_connect)) {
return self::$_connect;
}
self::$_connect = new PDO('bla bla bla');
return self::$_connect;
}
} public static function getObject() {
new static()
}Одиночка (англ. Singleton) — порождающий шаблон проектирования, гарантирующий, что в однопоточном приложении будет единственный экземпляр класса с глобальной точкой доступа.
// Что такое 100, что такое "2013-10-04 12:16:47"?
// Понятно, что IDE помогает, но когда такие билдеры на пол-экрана,
// как-то надоедает мышкой по переменным водить, чтобы понять что тут происходит.
$pond->addStockData(new StockData("Bream", 100, "2013-10-04 12:16:47"));
// Вот если массивом объявить, то сразу понятно, что 100 - это количество. Да и выглядит компактнее.
$pond = [
'name' => 'Breakspear',
'amenities' => ['shop'],
'fishBreeds' => [
['name' => 'Bream', 'number' => 100, 'stocked' => '2013-10-04 12:16:47'],
['name' => 'Perch', 'number' => 50, 'stocked' => '2012-02-02 05:23:32'],
['name' => 'Common Carp', 'number' => 10, 'stocked' => '2011-01-23 14:42:59'],
],
];
$ponds[] = $pond;Намного меньше кода для получения того же результата.
Часто это реализовывается как многофункциональные классы со здоровыми методами, использующими вложенные циклы.
$ponds = new PondsCollection(); $ponds->add(...);'fishBreeds' => [
['name' => 'Bream', 'numbr' => 100, 'stocked' => '2013-10-04 12:16:47'],
['name' => 'Perch', 'number' => 50, 'stocked' => '2012-02-02 05:23:32'],
['name' => 'Common Carp', 'number' => 10, 'slocked' => '2011-01-23 14:42:59'],
]
```А их там аж 2...<?php
$time = microtime(true);
$data = [0,1,2,3,4,5,6,7,8,9];
for($i=0;$i<500;$i++){
$item = $data[rand(0,9)];
}
echo (microtime(true) - $time).' '.memory_get_usage()."\n";<?php
$time = microtime(true);
class Example
{
protected $data = [0,1,2,3,4,5,6,7,8,9];
public function getItem($index)
{
return $this->data[$index];
}
}
$object = new Example();
for($i=0;$i<500;$i++){
$item = $object->getItem(rand(0,9));
}
echo (microtime(true) - $time).' '.memory_get_usage()."\n";<?php
$time = microtime(true);
class Example
{
protected $data = [0,1,2,3,4,5,6,7,8,9];
public function __call($method , $params)
{
if($method == 'getItem'){
return $this->data[$params[0]];
}
}
}
$object = new Example();
for($i=0;$i<500;$i++){
$item = $object->getItem(rand(0,9));
}
echo (microtime(true) - $time).' '.memory_get_usage()."\n";
$array['test'] = 3 к стати как то я 3 дня искал баг, и как раз из за этого. Если у вас объект вы можете защитить данные разграничить классы которые могут туда записать и т.д. и слёгкостью отследить в какой момент произошла запись вызов сеттера(исли он реализован). Ждем статью "Хватит злоупотреблять классами!"
Прекрати злоупотреблять массивами в PHP
private $collection = array();бдыщь
class PondsCollection implements IteratorAggregate
{
private $collection = array();
public function getIterator()
{
return new ArrayIterator($this->collection);
}
public function add($pond)
{
$this->collection[] = $pond;
}
}class PondsCollection implements IteratorAggregate
{
private $collection = array();
public function getIterator()
{
return new ArrayIterator($this->collection);
}
public function add(Pond $pond)
{
$this->collection[] = $pond;
}
}Как уже было сказано, я не знаю, что значат эти числа. А что, если их нужно будет 10, или нужно поменять порядок параметров?
У всех мейнстримовых фрейморкох слишком много абстракций, из-за чего трудно сделать даже базовые вещи, не убив много времени на изучение фреймворка.
С самописью взял бы и сделал и не мучался.
Скоро вроде будут переписывать.
как буду плеваться и на Symfony c Zend. :)
Для личных проектов есть ядро, которое писалось с моего начала программирования в 2008 году.
collections.namedtuple, которая очень подходит для сущностей сложнее кортежа, но недостаточно сложных для написания отдельного рукотворного класса. Уверен, что в насквозь динамическом PHP можно сделать аналог (или он уже существует).но в качестве DTO — почему нет?
но недостаточно сложных для написания отдельного рукотворного класса.
Уверен, что в насквозь динамическом PHP можно сделать аналог (или он уже существует).
Прекрати злоупотреблять массивами в PHP