Что-то я не ощутил разницы между trigger_error() и throw new RuntimeException(). И там, и там идёт прерывание кода(нотисы не в счёт, с ними разговор короткий). И там, и там идёт последующая обработка: показать страницу с ошибкой, записать в лог, уведомить заинтересованных. В чём всё-таки разница?
Комбинирование флагов — это так, бесплатное приложение к подходу. Основная идея в том, чтобы использовать битовые маски как битовые маски, а не как массив.
define('FLAG_CIRCULAR', 128);
define('FLAG_PUBLIC', 256);
class some
{
const FLAG_BLOCKED = 1;
const FLAG_BIG = 2;
const FLAG_LAST = 4;
const FLAG_BEST = 8;
const FLAG_COLORED = 16;
const FLAG_PREMIUM = 32;
const FLAG_WITH_SOUND = 64;
public $flags = self::FLAG_BLOCKED;
}
$lang_array = array(1 => 'заблокирована', 2 => 'большая', 4 => 'последняя',
8 => 'лучшая', 16 => 'цветная', 32 => 'высшего качества', 64 => 'со звуком',
128 => 'круглая', 256 => 'общедоступная');
$some = new some();
$some->flags ^= some::FLAG_BLOCKED; //не заблокирована
$some->flags |= some::FLAG_LAST; //эта вещь последняя
$some->flags |= some::FLAG_COLORED; //цветная
$some->flags |= some::FLAG_PREMIUM; //высшего качества
$some->flags |= some::FLAG_WITH_SOUND; //и со звуком
$some->flags |= FLAG_CIRCULAR; //так же она круглая
$some->flags |= 512; //ещё какой-то флаг
echo 'Эта вещь: ';
foreach ($lang_array as $key => $title)
if (($some->flags & $key) === $key)
echo '
'.$title;
echo '
Заблокирована? ';
echo (($some->flags & some::FLAG_BLOCKED) === some::FLAG_BLOCKED)? 'Да':'Нет';
echo '
Установлен ли флаг, который заранее не определён? ';
echo (($some->flags & 512) === 512)? 'Да':'Нет';
Мне показалась странной работа с флагами таким образом. Обычно, в качестве констант хранят не номер бита, а само значение. Это позволит ввести (если надо) дополнительные константы, которые комбинируют предыдущие.
Первое что бросилось в глаза — это бесконечный цикл for(;;) и ниже условие для выхода из цикла. Потом бессмысленный перевод индекса цвета в массив, потом использование простыней из switch. Короче, захотелось переписать.
class BrainLoller2 {
const DIRECTION_UP = 0;
const DIRECTION_RIGHT = 1;
const DIRECTION_DOWN = 2;
const DIRECTION_LEFT = 3;
protected $directions = array(array( 0,-1),
array( 1, 0),
array( 0, 1),
array(-1, 0));
protected $commands = array(0x00FF00 => '+',
0x008000 => '-',
0xFF0000 => '>',
0x800000 => '<',
0xFFFF00 => '[',
0x808000 => ']',
0x0000FF => '.',
0x000080 => ',');
protected $picture; // Картинка BrainLoller
protected $size = array(0,0);
function __construct($picture){
// Открываем собственно изображение
$this->picture = imagecreatefrompng($picture);
// Получаем размер изображения
$this->size = getimagesize($picture);
}
public function getCode(){
$current_pixel = array(0, 0); // Текущий пиксель (x, y)
$pointer = self::DIRECTION_RIGHT;
$code = '';
while(!($current_pixel[0] > $this->size[0] or $current_pixel[1] > $this->size[1] or
$current_pixel[0] < 0 or $current_pixel[1] < 0)){
$pixel_color = imagecolorat($this->picture, $current_pixel[0], $current_pixel[1]); // Берем цвет пикселя
$pixel_color &= 0xFFFFFF;
// Проверяем какой команде сопоставлен данный цвет, если поворот то поворачиваем, если команда то добавляем к $code
if (isset($this->commands[$pixel_color]))
$code .= $this->commands[$pixel_color];
elseif ($pixel_color == 0x00FFFF)
$pointer = ($pointer + 1) % 4;
elseif ($pixel_color == 0x008080)
$pointer = ($pointer - 1 + 4) % 4;
$current_pixel[0] += $this->directions[$pointer][0];
$current_pixel[1] += $this->directions[$pointer][1];
}
return $code;
}
function __destruct(){
imagedestroy($this->picture); // Высвобождаем занятые ресурсы
}
}
Очень не люблю когда вопрос о помощи начинается с «выходом из-за печки».
— Привет.
… Ждут ответа.
— Как дела?
… Ждут ответа.
— Есть время?
… Ждут ответа.
— Можешь помочь с *этой фигнёй*?
… Ждут ответа.
И только с пятого сообщения начинается вопрос по делу. По мне лучше всё одним сообщением:
— Привет. Не мог бы ты мне помочь с *этой фигнёй*? *Полное описание фигни*.
И ещё многие люди думают, что другие люди читают мысли и видят что творится на мониторе первых.
Я думаю, что некоммерческий проект — это проект у которого основная цель не извлечение прибыли. При этом получение прибыли не делает проект коммерческим.
Я думаю, что были бы полезны из статьи на соседние Числа и близкие по теме. Ну и тэги.
Так же будут упрощены установки флага:
снятия флага:
проверки флага:
Ну, а так… сервис, вроде, ничего себе…
Как дела обстоят с нагрузками?
P.S. Что-то мне подсказывает, что нельзя попасть в бесконечный цикл.
— Привет.
… Ждут ответа.
— Как дела?
… Ждут ответа.
— Есть время?
… Ждут ответа.
— Можешь помочь с *этой фигнёй*?
… Ждут ответа.
И только с пятого сообщения начинается вопрос по делу. По мне лучше всё одним сообщением:
— Привет. Не мог бы ты мне помочь с *этой фигнёй*? *Полное описание фигни*.
И ещё многие люди думают, что другие люди читают мысли и видят что творится на мониторе первых.
деньги, машину, квартиру — это раз.…
P.S. Code Kata кто-нибудь бы перевёл.