Работя с PHP от около 7 години вече, смея да кажа че го познавам изключително добре но това не ми пречи да се изненадвам понякога от него. Доста често приятно, или поне като е неприятно гледам да го запомня зада не се повтаря.
По принцип, страшно много си играя с array и със type-cast (особено с type-cast към масив) и предаването на различни аргументи из функции и методи. И за това от време на време си патя.
Имах един метод за работа с файлове, който приема масив с възможните файлови разширения + image опция в стандартния случай изглежда така:
array('doc', 'audio', 'flash');
array('doc', 'image' => '20x30'),
array('image' => array('20x30', '190x', '1234x234'));
Част от кода на метода е
class Upload {
// ... methods ...
public static function file($file, $directory, $types=false, $fname=false) {
if (!is_array($file) || !empty($file['error']) || strlen($file['name']) == 0){
return false;
}
if ($types) {
if (isset($types['image'])){
// вече този if e така, но за това по-нататък:
// if (is_array($types) && isset($types['image'])){
if (self::is($file['name'], 'image')){
return self::image($file, $directory, array_cut($types, 'image'));
}
}
if (!self::is($file['name'], $types)){
return false;
}
}
// continue ...
}
// ... methods ...
}
Та проблема настъпи когато пробвах това
Upload::file($_FILES['pic'], IMAGES_DIR, 'image');
Целта ми тука е да само да уплоадна една картинка, без никакви магии и т.н. които са в Upload::image, само че се викаше Upload::image. И защо ли ?
if (isset($types['image'])){
Оказва се че когато подам ‘image’ е true, което е доста странно, но се оправи лесно само със една проверка дали $types е масив. Проблема решен, но защо се появи на първо място ?!
В началото си помислих че isset($type['image']) проверява същност дали стринга е ‘image’, но после се сетих защо става така. В PHP могат да се извлече даден синвол чрез неговия индекс, все едно е масив, например:
$string = 'radoslav'; echo $string[0]; // r echo $string[7]; // v echo isset($string[0]); // true e echo isset($string[100]); // false е
И се оказва че когато съм предавал ‘image’ то си го е каствало към int, т.е. става 0, а първия символ е съществувал и за това винаги е било true. Доста интересен урок
п.п. Достъпа до даден символ е доста бърз чрез $string[$index], и в някои случаи е изключително удобен.

January 7th, 2009 at 12:48 pm
тука 190х пиксели ли са
array(‘image’ => array(’20×30′, ’190x’, ’1234×234′));
January 7th, 2009 at 2:26 pm
Всъщност, това значи да resize-ва само по дължина до 190 пиксели, ако беше x190, щеше да да resize-a само по височина
January 7th, 2009 at 3:05 pm
ами да логично. а и на другите няма px …