- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
static public function createFromStr($string)
{
$arr = explode('|', trim($string));
if (!empty($arr)) {
$object = new Fingerprint();
for($i = 0, $stop = count($arr); $i < $stop; $i++) {
$value = trim($arr[$i]);
switch($i) {
case 0:
$object->fingerprint = $value;
break;
case 1:
$object->ctrlV = (int)$value;
break;
case 2:
$object->printableKey = (int)$value;
break;
}
}
return $object;
} else {
return null;
}
}
создание объекта класса FingerPrint c помощью статического метода; facepalm
Нормальная практика, тащемта. В той же жабе есть подобный valueOf().
Завёз пруфы
Effective Java (2nd edition) - библия жаболюбов:
Item 1: Consider static factory methods instead of constructors
Но если это, например обычный конструктор типа:
то нужно уже так:
P.S. Ну можно делать комбо-конструкторы, которые и как new Foo() и как Foo() работают... Но, имхо, это то ещё говно.
Ложки нет.
Конструкторы никак не маркируются. Рантайму похуй. Ты любую функцию можешь вызвать как new SomeFunction(), при этом запилится объект, который будет доступен в SomeFunction() как this. Вот такой вот жс.
> Ложки нет.
Это совершенно не мешает делать new Foo() на любой функции и вызывать "конструкторы" как Foo()... Апофеоз слабой тупизации... Но адептам, наверное, нравится такая свобода.
P.S. Ну и то, что по вызову нельзя отличить - это даже плюс иногда. Вон в примере wvxvw с мапом. В питоне ты там можешь передать конструктор, а можешь просто функцию. И всё будет ок без всяких оборачиваний в лямбду...
P.S. + соглашение, что конструкторы пишутся с большой буквы, а методы - нет :)
Вот это - сомнительная штука по-моему. Потому, что часто неясно, это конструктор или преобразование.
x = Integer(y); vs x = toInteger(y);
В идеале надо скрывать конструирующий побочный эффект конструктора, делегировать разруливание компилятору, оставляя программисту просто функцию. Ну и запиливать аналог экстеншн методов. Чтоб каждый мог написать свой "конструктор" для объекта и вызывать Integer(myObject). В C++ хотя бы в описании своего ярко выраженного типа можно описать как бы конструктор другого типа; жаль, для произвольного нельзя в виде свободной функции.
тем не так часто это фича нужна
Ну какбы тут связывание ни при чем. Тут речь о том, что нельзя использовать конструктор как функцию (а иногда хочется).
Более того, с точки зрения типов, конструктор - это что-то непонятное. Т.е. вот функция: она понятная, у нее есть тип Range -> Image, а у конструктора вроде тоже есть точно такой же тип, но синтаксически его нельзя использовать там, где можно использовать любую другую функцию.