|
|
|
| Здравствуйте, нужна помощь в одной очень простой вещи. Смотрите: некий класс для работы с изображениями(обертка для GD), в нем есть такая ф-я:
<?
public function watermark($image, $where, $x = 0, $y = 0) {}
|
Задумка такова, что эта ф-я должна вызываться как-то так:
<?
$image->watermark('image.jpg', ImageLib::Down | ImageLib::Right);
|
Следовательно в теле класса есть такие строки:
<?
const Up = 0; // 0000000
const Down = 1; // 0000001
const Middle = 2; // 0000010
const YCoord = 4; // 0000100
const Left = 8; // 0001000
const Right = 16; // 0010000
const Center = 32; // 0100000
const XCoord = 64; // 1000000
|
Вопрос в чем - как мне в теле этой функции определять, что именно было послано в параметр $where (то-есть какие из констант)? Что-то мне подсказывает, что здесь как-то свитчем надо делать? | |
|
|
|
|
|
|
|
для: nikita2206
(29.09.2010 в 21:41)
| | Ну что, никто не знает? | |
|
|
|
|
|
|
|
для: nikita2206
(29.09.2010 в 22:35)
| |
if($where & ImageLib::Down) ...
|
| |
|
|
|
|
|
|
|
для: Trianon
(29.09.2010 в 22:38)
| | Это единственный вариант? Может можно покрасивее как-то сделать?
В любом случае, спасибо за ответ. | |
|
|
|
|
|
|
|
для: nikita2206
(29.09.2010 в 22:44)
| | чем не красиво-то?) | |
|
|
|
|
|
|
|
для: sl1p
(29.09.2010 в 22:47)
| | Не красиво выглядит вот такое засилие ифов.
<?php
if ($where & ImageLib::Up) {
echo 'ImageLib::Up';
} elseif ($where & ImageLib::Down) {
echo 'ImageLib::Down';
} elseif ($where & ImageLib::Middle) {
echo 'ImageLib::Middle';
} elseif ($where & ImageLib::YCoord) {
echo 'ImageLib::YCoord';
}
|
| |
|
|
|
|
|
|
|
для: nikita2206
(29.09.2010 в 22:49)
| | Можете поверить на слово, со switch это будет ещё некрасивее :)
switch ($where1 & ImageLib::HIghWord) {
case 1 && ($where2 & 'ImageLib::Up':
case 1 && ($where2 & ImageLib::Down):
............
}
Такая передача параметров просто как тип данных mysql SET(1,2,4,8,16) (64 кажется раза не 32)
FIND IN SET это простое \xxx & SET
, и так-же человеко-понятные ярлыки ещё нужно навешивать чтобы не забывать цифры.
ну можете ещё проверить одно из двух или оба значения, типа 3&'любые данные' в любом случае вернёт число от 0 до 3
Зато бывают случаи что даже хоть и всё в цифрах читать и делать заметно удобнее , меньше букв :) попробуйте сделать сразу например 15 действий, а потом в зависимости от успешности выполнения определённых совокупностей этих действий построить логику.
получите много повторяющихся if ($first ==1 && $next==1 && ... много раз) ,
цифры с комментариями будет заметно компактнее.
И просто компактность данных. | |
|
|
|
|
|
|
|
для: heed
(30.09.2010 в 00:07)
| | Спасибо, я правда не понял причем SQL. Я вот думаю, может можно выкрутиться как-то с четыричной системой счисления, у меня ведь всего два параметра и у каждого четыре позиции возможных. | |
|
|
|
|
|
|
|
для: nikita2206
(29.09.2010 в 22:49)
| | выбор значений констант подразумевает, что одновременно могут оказаться переданными сразу несколько флагов, а значит switch здесь неприменим. В противном случае константы были бы выбраны последовательно нарастающими целыми числами (а не последовательными двоичными разрядами.)
switch вообще редко где можно применить оптимально, красиво и со смыслом. | |
|
|
|
|
|
|
|
для: Trianon
(30.09.2010 в 08:11)
| | Ясно, спасибо. | |
|
|
|
|
|
|
|
для: Trianon
(30.09.2010 в 08:11)
| | >switch вообще редко где можно применить оптимально, красиво и со смыслом
здесь не соглашусь.
Например если двумя из битов как-раз и передаётся число 0-3, switch
может предоставить больше гибкости в обработке на основе именно этих двух бит. В switch есть то чего нет в if-elseif-else, возможность один блок использовать сразу в двух и более случаях.
например:
switch(x)
case 0:
echo 0
case 1:
echo 1;
break;
покажет 01 если 0 или 1 если 1
с if-else получится так
if (x=0) echo '01';
elseif (x=1) echo 1;
т.е в первом блоке приходится выполнять то-же что выполняется могло-бы выполниться во втором.
Не слишком частые случаи конечно, но хоть какое-то утешение отсутствию goto в php :)
10:43
>причем SQL.
там просто о аналогичном типе данных. с аналогичными
const Down = 1; // 0000001
const Middle = 2; // 0000010
// 0000100 ...... | |
|
|
|
|
|
|
|
для: nikita2206
(29.09.2010 в 21:41)
| | А чего вы хотите передать классу - константы как руководство к действию, или все таки координаты? | |
|
|
|