Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Работа с битами...
 
 автор: nikita2206   (29.09.2010 в 21:41)   письмо автору
 
 

Здравствуйте, нужна помощь в одной очень простой вещи. Смотрите: некий класс для работы с изображениями(обертка для 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 в 22:35)   письмо автору
 
   для: nikita2206   (29.09.2010 в 21:41)
 

Ну что, никто не знает?

  Ответить  
 
 автор: Trianon   (29.09.2010 в 22:38)   письмо автору
 
   для: nikita2206   (29.09.2010 в 22:35)
 

if($where & ImageLib::Down) ...

  Ответить  
 
 автор: nikita2206   (29.09.2010 в 22:44)   письмо автору
 
   для: Trianon   (29.09.2010 в 22:38)
 

Это единственный вариант? Может можно покрасивее как-то сделать?
В любом случае, спасибо за ответ.

  Ответить  
 
 автор: sl1p   (29.09.2010 в 22:47)   письмо автору
 
   для: nikita2206   (29.09.2010 в 22:44)
 

чем не красиво-то?)

  Ответить  
 
 автор: nikita2206   (29.09.2010 в 22:49)   письмо автору
 
   для: 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';
}

  Ответить  
 
 автор: heed   (30.09.2010 в 00:07)   письмо автору
 
   для: 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 && ... много раз) ,
цифры с комментариями будет заметно компактнее.
И просто компактность данных.

  Ответить  
 
 автор: nikita2206   (30.09.2010 в 10:43)   письмо автору
 
   для: heed   (30.09.2010 в 00:07)
 

Спасибо, я правда не понял причем SQL. Я вот думаю, может можно выкрутиться как-то с четыричной системой счисления, у меня ведь всего два параметра и у каждого четыре позиции возможных.

  Ответить  
 
 автор: Trianon   (30.09.2010 в 08:11)   письмо автору
 
   для: nikita2206   (29.09.2010 в 22:49)
 

выбор значений констант подразумевает, что одновременно могут оказаться переданными сразу несколько флагов, а значит switch здесь неприменим. В противном случае константы были бы выбраны последовательно нарастающими целыми числами (а не последовательными двоичными разрядами.)
switch вообще редко где можно применить оптимально, красиво и со смыслом.

  Ответить  
 
 автор: nikita2206   (30.09.2010 в 10:33)   письмо автору
 
   для: Trianon   (30.09.2010 в 08:11)
 

Ясно, спасибо.

  Ответить  
 
 автор: heed   (01.10.2010 в 05:08)   письмо автору
 
   для: 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 ......

  Ответить  
 
 автор: sim5   (01.10.2010 в 05:18)   письмо автору
 
   для: nikita2206   (29.09.2010 в 21:41)
 

А чего вы хотите передать классу - константы как руководство к действию, или все таки координаты?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования