Jan 06

Работя с 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], и в някои случаи е изключително удобен.

3 коментара за "Странно държание от PHP-то"

  1. Dopecho каза:

    тука 190х пиксели ли са
    array(‘image’ => array(’20×30′, ’190x’, ’1234×234′));
    ;)

  2. Radoslav Stankov каза:

    Всъщност, това значи да resize-ва само по дължина до 190 пиксели, ако беше x190, щеше да да resize-a само по височина :)

  3. Dopecho каза:

    ами да логично. а и на другите няма px … :)

Какво мислите по въпроса