Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
это не дает никаких преимуществ по сравнению с процедурным программированием
<?php
class My_Math {
public static function fibonachi($n) {
return ...;
}
public static function getK($m, $n) {
return ceil(($m / $n) * log(2));
}
}
Статические свойства никогда не должны быть доступны снаружи
<?php
class My_Date {
// Пусть в моей системе будет только один справочник со списком месяцев
public static $months = array('Январь', 'Февраль', ...);
// Сделал бы его константой класса, но константы не могут быть массивами :(
}
Статические свойства существуют, по большей части, как техника оптимизации, они не должны рассматриваться как философия программирования.
<?php
class My_Pager {
// Каждый экземпляр должен знать свой порядковый номер, что бы генерить уникальные ссылки
protected $_num = 0;
// Но как же его посчитать автоматически?
// А вот как:
protected static $_cntPagers = 0;
public function __construct()
{
$this->_num = self::$_cntPagers++;
}
}
Если несколько функций можно как-то сгруппировать по тематике, то я их группирую в один статический класс
Статические свойства никогда не должны быть доступны снаружи
Почему бы и нет?
My_Date::$months. Это ни хорошо, ни плохо. Важно понимать что это за собой влечет.Статические свойства существуют, по большей части, как техника оптимизации, они не должны рассматриваться как философия программирования.
Как насчёт этого?
это не дает никаких преимуществ
Вам придется жестко привязаться к
Но Вы же и философию из этого не делаете, верно?
вы бы легко впилили туда перевод
echo '<select>';
foreach (My_Date::$months as $month) {
echo '<option>'. translate($month) .'</option>';
}
echo '</select>';
Почему бы и нет?
<?php class My_Date { // Пусть в моей системе будет только один справочник со списком месяцев public static $months = array('Январь', 'Февраль', ...); // Сделал бы его константой класса, но константы не могут быть массивами :( }
getConstList(). // Из доков:
echo new Month(Month::June); // выведет: 6
// Тот же самый результат:
echo Month::June;
// Но мне проще написать:
if ( ! array_key_exists(13, My_Date::$months)) {
echo 'Error!';
}
// чем писать это:
try {
new Month(13);
} catch (UnexpectedValueException $uve) {
echo $uve->getMessage();
}
if ($month == Month::June) является и более понятной, и более гибкой для модификации, и более защищенной от ошибок чем if ($month == 6) или if ($month == arrray_search("Июнь", Month::$months)) (кстати, эти два фрагмента не эквивалентны с вашим определением Month::$month, у вас нумерация месяцев начинается с нуля )static private $userData = NULL;
public function getById($uid) {
if (self::$userData) return self::$userData;
self::$userData = $this->locGetById($uid);
return self::$userData;
}
private function locGetById($uid) {
// some code $retData = ...
return $retData;
}
$db = new Database('localhost', 'user', 'password');Спасибо за перевод, но статья ужасная, а её автор посмотреть бы на фреймверки, и почитать про исключения.
Я уже представляю как в каждом контролере надо будет писать $db = new Database('localhost', 'user', 'password');
$bar = Foo::bar(); он не может узнать где произошла ошибка, в этом ему могут помочь исключения и трейс.class Controller {
public function foo(){
return My_Class::foo();
}
public function bar(){
return My_Class::bar();
}
}
class Controller {
public function foo(){
$db_confog = include 'config/database.php';
$db = new Database($db_confog['host'], $db_confog['user'], $db_confog['password']);
$my_class = new My_Class($db);
return $my_class->foo();
}
public function bar(){
$db_confog = include 'config/database.php';
$db = new Database($db_confog['host'], $db_confog['user'], $db_confog['password']);
$my_class = new My_Class($db);
return $my_class->bar();
}
}
Судя по замыслу автора это должно быть как то так
class Controller {
private $my_class;
public __construct(My_Class $myClass) {
$this->my_class = $myClass;
}
public function foo(){
return $this->my_class->foo();
}
public function bar(){;
return $this->my_class->bar();
}
}
class UserController extends BaseController {
/**
* Show the profile for the given user.
*/
public function showProfile($id)
{
$user = User::find($id);
return View::make('user.profile', array('user' => $user));
}
}
</spoiler>
И в итоге ваш контролер будет работать только с 1 классом?
И чем Dependency Injection поможет в данном случае?
User::find($id);
Это может привести {в => к} проблемам.Просто нужно понять, что в момент запуска скрипта PHP контекст УЖЕ создан ядром PHP и можно либо поверх него создавать собственную систему, абстрагируясь от встроенных возможностей (только зачем тогда вообще использовать PHP, как основную систему?????)
Т.е. вопрос не в правильном использовании ООП-подхода, а грамотной проекции их в PHP.
Например, PHP — это не просто язык с операторами, это множество кубиков: сессии, расширения, глобальные супермассивы, модули к http-серверам и т.д.
if ($_SERVER["method"] == "POST")
do_smth_with_post_superglobal();
if ($_SERVER["method"] == "POST")
do_smth_with_array($_POST);
, а то иspl_autoload_register, __autoload). Arr для работы с массивами, и вызывать его статические функции в коде — при этом он будет автоматически загружаться при первом вызове. Опять же, при этом все функции обретают пространство имен Arr — такой плюс потерял актуальность с версии 5.3, где появились настоящие пространства имен, но все же.
Статические члены класса. Не дай им загубить твой код