مکتبخانهی استاتیکیه
منابع استاتیک خواصی داره که در شرایط خاص میتونه بهینگی ایجاد کنه و گاهی نجاتبخش باشه.
منابع استاتیک رو میشه به یک متغیر داخل تابع اختصاص داد و یا در کلاسها استفاده کرد با مدل اول کاری ندارم چون به نظرم به درد نمیخوره.
در برنامهنویسی شیگرا و در کلاسها، براساس توضیح سایت PHP، منابع استاتیک امکان فراخوانی بدون نمونهگیری رو فراهم میکنه.
یعنی فقط با استفاده از نام کلاس میتونیم به یک مقدار استاتیک اون کلاس دسترسی داشته باشیم.
در زیر نکات مربوط به این کلمهی کلیدی بصورت خلاصه آورده شده:
تعریف مشخصههای استاتیک: در مقدار فقط میشه از مقادیر ثابت استفاده کرد.
class A {
static public $name = 'Amir Hossein'; // Correct!
static public $family = touppercase('hp'); // Wrong!
static public $zone = 'Asia'.'/'.'Tehran'; // Wrong!
}
فراخوانی خارج از کلاس:
class B {
static public $name = 'Amir Hossein';
}
echo B::$name; // Amir Hossein
فراخوانی متد استاتیک خارج از کلاس و تعریفش:
class C {
static public function hello($name){
echo 'Hello '.$name;
}
}
echo C::hello('Amir Hossein'); // Hello Amir Hossein
مقادیر استاتیک یک مقدار بیشتر نیستند اگر تغییر کنند همهجا تغییر میکنند. در نمونهی زیر یک مشخصه خارج از کلاس مقدارش تغییر کرده و میبینی که مقدار قبلیش دیگه وجود نداره:
class D {
static public $name = 'Amir';
static public function hello($greeting){
echo $greeting .' '. self::$name;
}
}
D::hello('Hello'); // Hello Amir
D::$name = 'Hossein';
D::hello('Hello'); // Hello Hossein
در متدهای استاتیک نمیشه از کلمهی کلیدی this$ استفاده کرد چون this$ یک مقدار داینامیکه.
class A {
static public $name;
public $gender;
public function correct(){
self::name = 'Hossein';
$this->$gender = 'Male';
}
static public function wrong(){
self::name = 'Amir Hossein';
$this->$gender = 'Male'; // Wrong!
}
}
تفاوتی نمیکنه کلمهی کلیدی static قبل یا بعد از public/protected/private قرار بگیره یا بعدش. یه سری اول میذارند تا سریع بتونند منابع استاتیک رو تشخیص بدند و یک سری ترجیح میدند برعکس عمل کنند تا سطح دسترسی رو اول ببینند.
کاربرد استانیک به این صورته که، در کلاسها وقتی تابعی نوشته میشه واقعا با جریان اطلاعات در کلاس درگیر نیست رو استاتیک میکنند تا در کارکرد PHP بهینگی ایجاد شه. مثلا در یک کلاس یک تابع Validator داریم که متغیرش رو چک میکنه که معتیر باشه. از اونجاییکه این تابع ربطی به روند کلاس نداره میتونه استاتیک باشه:
class A {
public function __construct($phone){
if( self::validate($phone) )
echo 'Valid';
else
echo 'Invalid';
}
static public function validate($int){
return is_numeric($int);
}
}
$a = new A(567); // Valid
$b = 'Boplo';
if( A::validate($b) )
echo 'OK';
کاردبرد دیگهی استانیک اینه که میتونیم از کپی شدن منابع جلوگیری کنیم. مثلا در الگوی Singleton ما کاری میکنیم تا فقط یکبار بشه از یک کلاس نمونهگیری کرد و این نمونه رو همهجا در دسترس داشت:
class A {
static public $instance;
public $name;
private function __construct(){
$this->name = 'Amir Hossein';
}
static public function getInstance(){
if(!isset(self::$instance))
self::$instance = new self;
return self::$instance;
}
}
$name = A::getInstance()->name;
echo $name; // Amir Hossein
$a = A::getInstance();
echo $a->name;
$a = new A; // ERROR
از اونجاییکه متد construct از نوع private هست نمیشه مستقیم اجراش کرد تنها راه دسترسی بهش، یک تابع درون خود کلاس هست. با این کار فقط یک نمونه از کلاس تولید میشه و همهجا در دسترسه. که البته این الگو نکاتی هم داره.
نکتهی مهم و جدید، ارثبری در منابع استاتیک هست. همونجور که میبینی با کلمهی کلیدی self به منابع استاتیک در درون کلاس دسترسی داریم:
class Father {
static public $name = 'Father';
static public say(){
echo self::$name;
}
}
class Son extends Father {
static public $name = 'Son';
}
class Baby extends Son {
static public $name = 'Baby';
}
Father::say(); // Father
Son::say(); // Father
Baby::say(); // Father
همونجور که میبینی self در اینجا معلوم نیست کدوم مقدار رو باید استفاده کنه و خب از مقدار واقعی خودش استفاده میکنه!
برای این مشکل در نسخهی 5.3 قابلیتی با عنوان Late Static Binding ایجاد شد که میگه در چنین حالتی بجای self از کلمهی static استفاده کنید تا PHP بره مقدار متتاظر رو استفاده کنه:
class Father {
static public $name = 'Father';
static public say(){
echo static::$name;
}
}
class Son extends Father {
static public $name = 'Son';
}
class Baby extends Son {
static public $name = 'Baby';
}
Father::say(); // Father
Son::say(); // Son
Baby::say(); // Baby
همونجور که میبنی در تابع say بجای self از static استفاده کردم که باعث میشه PHP هوشمندانهتر عمل کنه.
موفق باشید
برچسب ها: solution,tips
یه مشت حرف به دردبخور
من صندوقچهی فهموشعور PHPی خودم رو تکوندم یه سری نکته ازش ریخت بیرون. نکاتی که برای پیدا کردن بعضیهاش باید اینترنت رو زیر و رو کنیم یا نکاتی سادهای که ازشون خبر نداشتیم. خیلی سعی کردم هر چی به ذهنم میرسه لیست کنم. یه لیست ۴۴تایی شد که ممکنه بعدا باز هم بهش اضافه کنم.!
مقاله برای سطح دانش خاصی نیست. از نکات خیلی ساده و ابتدایی درش هست تا نمونههای تخصصی.
برای مطالعهی این نکات، به ادامهی مطلب مراجعه بفرمایید.
همچنین فهرست عناوین هم در زیر قرار گرفته:
برچسب ها: function,solution,tips
فی الاحوالات مرجع المراجع جاوااسکریپت فی الجیرافیک
واندر باب اشکال الجیرافیکی و نمودارات جاوااسکریپتی وکتور، سبکتر و سهلتر از پیر فرزانه شیخ رافائل نتوان یافت.
شیخ ما از SVG و VML اشکالی بس وکتور و جذاب خلق میکند که همگی DOM هستند و قابل الکنترل فی الجاوااسکریبت. و بسی پر ساپورت فی المرورجرات الکثیر از جمله +IE6.
رسم اشکال گرافیکی بس باحال در رافائل بی اختیار ذهن آدمی را عطف سلطان جنگل شیر در بین میوهجات یعنی هلوی معظم میکند. او که با افعالی بس ساده چنین هفت رنگ قوس و قزح وار بر بوم اسکرین میفشاند، افعالی برای کنترل و جذابیت بخشیدن به آنها نیز دراست کرده افعالی برای متحرک سازی، این جادوی امروزه. افعالی برای کشش و رها یا به قول اجنبی کافر Drag and Drop. افعالی در باب سهولت در کدنگاری چون رویدادها و افعال جانبخش دیگر.
از جالبات و سودمندیات ایشان، DOM بودن این رسوم قابلیت الدسترسی فی کدات جاوااسکریپت و سیاساس است که میتوان ایشان را با بقیة الالمنت صفحه ترکیب و استفاده کرد.
از کاربردات الاصلی این مرجع المراجع، رسم تصاویر بدون دخالت العکس و رسم نمودارات خطی، میلهای، قرص نانی و امثالهم است.
فی الاهداف تشکیل این نگاشته همانا آموزش این شیخ طاهر بود که خود بهتر دیدم که تو رهجوی راه حق در وب را به آموزشات بس کامل و بهروز خود این شیخ رهنمود کنم که آنجا مثالهای کثیر و اطلاعات السودمندی یافت میگردد.
« Raphaël—JavaScript Library »
باشد که خداوند به نگارندهی این اثر یعنی میرزا دیمیتری خان بارانووسکی خیر کثیر مرحمت کند و شیخ ما را قرین التوسعه!
برچسب ها: javascript,solution
۹۰ مبارک!
۱ فروردین ۱۳۹۰ ساعت ۰۱:۵۰
سال نوو مبارک!
۹۰، ۹۰ تا مبارک! ۹۹۰ تا مبارک! خیلی مبارک!
امیدوارم در سال جدید، هر سه مورد زیر رو باشی:
- شنگول.
- منگول.
- و از همه مهمتر، حبهی انگول.

برچسب ها: مناسبت
یک تابع ساده برای خلاصه سازی و کوتاه سازی متن مثل بعضی بلاگها که خلاصه متن رو در صفحه اول نمایش میدهند. کار ویژه ای که این تابع میکنه اینه متن رو تا حد امکان خراب نمی کنه.
نحوه کارش به این صورته که مثلا عدد 500 رو به عنوان تعداد کاراکتر میگیره و عدد مثلا 100 به عنوان Offset. از کاراکتر 500 شروع میکنه 100 کاراکتر به عقب برمیگرده تا به نقطه یا کاما یا خط جدید یا ... برسه (اینها نشانه های اتمام جمله هستند). وقتی پیدا کرد متن رو همونجا جدا میکنه.
اگر چیزی پیدا نکرد، 100 کاراکتر به جلو میره تا پایان جمله رو پیدا کنه. اگر چیزی پیدا نکرد نزدیکترین فاصله رو از کاراکتر 500 انتخاب میکنه.
نکته مهم اینه که این تابع از توابع ساده ی PHP برای String استفاده میکنه که با فارسی بصورت یونیکد برخورد میکنند برای نمونه تعداد کاراکترهای یک متن فارسی رو دو برابر یک متن انگلیسی در نظر میگیرند. پس باید دقت کنیم که موقع استفاده از این تابع هر تعداد کاراکتری که به عنوان limit و offset برای فارسی استفاده میکنیم باید دو برابر مقداری باشه که برای غیرفارسی بکار میبریم تا نتیجه معقول باشه.
لطفا قبل از مصرف، توضیحات و پارامترهای تابع رو کامل مطالعه بفرمایید.
/**
* Summarize text
* Author AHHP ~ Boplo.ir
*
* @param string $str Text to summarize.
* @param integer $limit Number of characters to trim.
* @param integer $offset Number of characters to
* move backward and/then forward of $limit
* for finding line/sentence/word ending.
* @param array $endlineChars Known characters as
* line/sentence/word ending characters.
* @return string Summarized string.
*
* Please note that
* Length of a latin text is NOT equal to a
* Unicode text in PHP (Farsi is Unicode).
* It means PHP counts e.g. 100 Farsi characters
* as 200 characters. So you should use bigger
* numbers as $limit and $offset parameters
* while using this function for Farsi texts.
*/
function summarize($str, $limit=600, $offset=100, $endlineChars=array('.','!','?',"\n",')',';',',','؟','،')) {
if(strlen($str)<=$limit)
return $str;
for($i=$limit; $i>$limit-$offset; $i--) {
if(in_array($str{$i}, $endlineChars)) {
$length = $i;
break;
}
if(!isset($spaceLength) && $str{$i}==' ')
$spaceLength = $i;
}
if(isset($length))
return substr($str, 0, $length+1);
for($i=$limit; $i<$limit+$offset; $i++) {
if(in_array($str{$i}, $endlineChars)) {
$length = $i;
break;
}
if(!isset($spaceLength) && $str{$i}==' ')
$spaceLength = $i;
}
if(isset($length))
return substr($str, 0, $length+1);
if(isset($spaceLength))
return substr($str, 0, $spaceLength);
return substr($str, 0, $limit+1);
}
برچسب ها: function,solution
13 راه برای سادهسازی ثبتنام
خیلی اتفاقی به مقالهای در سایت Baymard Institute برخوردم. این پست براساس این مقاله نوشته شده: Twelve Ways to Simplify SignUp
صحبت سر ثبتنام کاربره. از اونجاییکه هدف اصلی سایتها جذب کاربر هست باید شرایطی رو فراهم کنند تا کاربرها با هر سطحی از دانش و تجربه، احساس راحتی بکنند و دچار مشکل نشند. ثبتنام از اونجاییکه حساسیتهایی داره معمولا با پیچیدگی انجام میشه.
در این پست راههای پیشنهاد شده تا از این پیچیدگیها کم کنیم تا کاربر احساس آسودگی بیشتری کنه و تمایل بیشتری برای ثبتنام در سایت داشته باشه.
لیست زیر حرف دل کاربرانیست که در حال ثبتنام در سایت هستند:
من یه Username جدید به ذهنم نمیرسه! نمیشه از آدرس ایمیلم استفاده کنید؟
این کار عملیات ثبتنام رو خیلی راحت میکنه. من خودم موقع اینجور ثبتنام کلی فکر میکنم که نامکاربری برای خودم انتخاب کنم.
از اونجایی که در این روش، کاربر نام کاربری وارد نکرده، برای نمایش از نام و نامخانوادگیاش استفاده میشه و این کار، کاربران رو تشویق میکنه تا از نامهای واقعیاشون توی سایت استفاده کنند. این موضوع برای ظاهر سایت خیلی اهمیت داره.
یکی توی سایتش امکان استفاده از Username رو میده و کاربری با نامکاربری Sanaz_joon_jigar_tala در سایت دیده میشه. همین شخص در سایتی که از Username نمیخواد، از نام واقعیش یعنی "اکبر قویمنش" استفاده میکنه (مثلا)! حالا خودت بگو خداییش کدوم بهتره؟
تو رو خدا بذار هر پسوردی دوست دارم انتخاب کنم!
این خیلی خوبه که به کاربر بگیم که پسوردی که انتخاب کرده چقدر خوب یا ضعیفه ولی زیادهروی هم خوب نیست. بعضی سایتها کاربر رو مجبور میکنن که پسوردی انتخاب کنه که اگه یادداشت هم بکنه نتونه از روش بخونه! پس بهتره میزان امنیت پسورد رو به کاربر نشون بدیم و واسش توضیح بدیم که خطراتی داره ولی بهش گیر ندیم!
واقعا دونستن دور کمر من برای ثبتنام لازمه؟
تا جایی که ممکنه اطلاعات غیرحساس رو بعد از ثبتنام از کاربر بخوایم نه موقع ثبتنام! بعضی سایتها آدم رو مجبور میکنند کل پروفایل رو موقع ثبت نام پر کنیم. آخه این کار درسته؟
حتما باید کل فرم رو پر کنم بعد بگی این Username اِشغاله پدرسوخته؟!
اگر میخوایم از Username استفاده کنیم یکم فهمیده عمل کنیم و کاربر رو مجبور نکنیم تا همهی فرم رو پر کنه بعد بفهمه Usernameای که انتخاب کرده قبلا ثبت شده. بعضی سایتها کلی بیشعورند! کاربر باید دو تا پسورد و یک CAPTCHA رو هر دفعه پر کنه! بعد میگند چرا کسی ثبت نام نمیکنه یا چرا 10000 تا کاربر داریم ولی فقط 10 نفر فعالند!
راه خوب اینه: همزمان که کاربر نامکاربری رو پر کرد با AJAX چک کنیم و بهش اطلاع بدیم. من میخواستم توی سایت AOL ثبتنام کنم باور کن 30 تا Username چک کردم حتی "Boplo" رو هم ثبت کرده بودند!! اگر قرار بود هر دفعه با Submit خطا بگیرم عمرا ثبتنام نمی کردم. سایتهایی مثل یاهو یا همون AOL حتی پیشنهاد هم میدند که مثلا AmirHossein قبلا ثبت شده ولی Amir_hossein رو میشه انتخاب کرد.
واقعا باید "کاستیدگیلینکوفینوستا با لیمو" رو تایپ کنم؟
این CAPTCHA یا همون کد امنیتی واقعا به خودی خود کابوس شده. سیستم تولید CAPTCHA در بعضی سایتها نه تنها بیمهابا عدد و حروف کوچیک بزرگ رو با هم میکس میکنند بلکه از فونتهای عجیب غریب و زمینههای گیجکننده هم استفاده میکنتد. نمونهاش همین vBulletin. من شخصا نمیتونم CAPTCHAاشون رو بخونم. مرگ برچنین سایتهایی!
راستی "کاستیدگیلینکوفینوستا" با چی؟!!
مگه همین الان ثبتنام نکردم؟ دوباره Login کنم؟ خری؟!
بیایم یه زحمت بکشیم و وقتی کاربری ثبتنام کرد توی سایت لاگینش هم بکنیم. لاگین بعد از ثبتنام شبیه یه جور جوک میمونه.
پس این ایمیل Wellcomeاش کو؟! اگه قراره نشه پیداش کرد چرا میفرستند؟
ایمیل Wellcome یا اون ایمیلی که بعد از ثبتنام به کاربر فرستاده میشه میتونه بعدا هم به درد بخوره اگر اطلاعات خوبی توش باشه. اطلاعات خوب مثل نام کاربری و روش تغییر پسورد. این موضوع باعث میشه کاربر احساس کنه این ایمیل بعدها، یه روزی، ممکنه به دردش بخوره. اما وقتی اون روز میرسه، چطور باید ایمیل رو پیدا کرد؟ باید توی عنوان و متن ایمیل صراحتا نام سایت رو ذکر کنیم تا با سرچ یا چک کردن Inbox پیدا بشه.
ضمنا سعی کنیم خود پسورد رو توی این ایمیل قرار ندیم. من شخصا اگر جایی ثبتنام کنم و این کار رو بکنه، بدون فوت وقت ایمیلش رو پاک میکنم. در این حالت دیگه متن و عنوان ایمیل دیگه بازی نیست!
ایول! بالاخره فرم ثبتنام رو پیدا کردم! 20 دقیقه بیشتر طول نکشید...
فرم ثبتنام رو تو سایت قایم نکنیم! من خودم تا حالا لینک صفحهی ثبتنام کلی از سایتها رو توی فوتر سایت (همون لینکهای ریز پایین پایین صفحه) پیدا کردم.
سایتهایی که فعالیت اصلیاشون روی کاربران هست (مثل سایتهای دوستیابی) بهتره که فرم ثبتنام رو توی صفحه اصلی قرار بدهند.
برای چی باید ثبتنام کنم؟ که اسمم رو گوشه صفحه ببینم؟
هدف کاربر جمع کردن نیست هدف اصلی ارائهی خدمات به شخص کاربر هست یعنی داشتن کاربر باحالی محسوب نمیشه فایده هم نداره برای کاربر داشتن باید منظور واقعی و قانعکننده داشت.
با این فرم هم میشه لاگین کرد هم ثبتنام! چه zexy!
این واقعا باحاله که یک فرم داشته باشیم با دو تا دکمه یکی برای ثبتنام و یکی برای لاگین. این گوگولیترین مدل جمع و جور سازی هست!
همین؟ ثبتنام با یه ایمیل فقط؟ چه قانع!
در راستای فرهنگ جمع و جورسازی میشه با دریافت یک ایمیل هم ثبتنام کرد! در این حالت یک پسورد برای کاربر ساخته میشه و براش ایمیل میشه. این یک روش خداپسنده است که زحمت Activation رو هم خودش میکشه اما واسه خود من عوض کردن پسورد چندان هیچانانگیز نیست! مگه اینکه برای بار اول، کاربر با فرم تغییر کلمه عبور روبرو شه. اینجوری مجبور میشه رمزش رو عوض کنه به اونی که باحاش حال میکنه.
لاگین با اکانت جیمیل! جل الخالق!!
یه سری آدم دور هم جمع شدند تا کاربر هر چه راحتتر لاگین کنه. OpenID چنین امکانی رو فراهم کرده تا فقط با یک اکانت در سایتهای مختلفی لاگین کنیم. یعنی در واقع ثبتنام بی ثبتنام.
این روش به این هلویی که به نظر میاد نیست دردسرهای خودش رو داره.
این هم از طرف Boplo.ir:
اینجوری میشه که وقتی ثبتنام تکمیل شد بجای اینکه پیغام "کاربر محترم واقعا خسته نباشید!" رو نمایش بدیم روی صفحه مینویسیم:
کاربر محترم، شاید باورت نشه ولی تو الان در سایت ثبتنام شدی!
برچسب ها: solution,معماری سایت
PDO چیست؟
۱۰ بهمن ۱۳۸۹ ساعت ۰۱:۴۸
معرفی افزونه PDO برای دستیابی بهتر به دیتابیس
PDO یک افزونه سبک و قدرتمند PHP برای به دیتابیسه . از خصوصیات خوب این افزونه که از نسخه 5.1 روی PHP نصب شده موارد زیر است:
- پشتیبانی از دیتابیسهای متنوع از جمله MySQL، MsSQL، SQLite و غیره با توابع ثابت.
امکان فوق العاده PDO که اجازه میده تا بدون تغییر کدها، دیتابیس رو تغییر بدیم. یعنی مثلا اگر Applicationای با MySQL ساخته باشیم و تحت شرایطی مجبور به تغییر دیتابیس به MsSQL باشیم، اگر سینتکس کوئری ها مشکلی ایجاد نکنه، کافیه دیتابیس رو تعویض کنیم و همین. برای سیستمهای بزرگ این یک مزیت خیلی مهمه.
- پشتیبانی از Exceptionهای PHP.
Exceptionها امکان کنترل و بدست گیری خطاها رو به برنامه نویس میده. PDO امکان کنترل خطاهای دیتابیس رو هم بهمون میده.
- پشتیبانی از Prepared Statement و Stored Procedure ها و Multiple Recordset.
این سه مورد هیچ کدوم توسط توابع کثافت MySQL اجرا نمیشند. PDO مورد آخر رو در حال حاضر برای MySQL پشتیبانی نمی کنه.
- طراحی شده به شکل کلاس.
قابلیت مهمی که امکان گسترش و شخصی سازی PDO رو میده مثلا رفتار توابعش رو تغییر بدیم یا توابع جدیدی بهش اضافه کنیم و در واقع همه امکانات شی گرایی رو باهاش داشته باشیم.
PDO از سه تا کلاس تشکیل شده:
- کلاس اصلی به نام PDO که حاوی توابع اصلی مثل اجرای کوئری و اتصال و غیره است.
- کلاس با نام PDOStatement حاوی توابع برای پردازش و بهره گیری از کوئری های اجرا شده است مثل fetch.
- کلاس PDOException برای بدست گیری خطاهای رخ داده.
این موارد همه
در ادامه، به همراه آموزش ابتدایی، بیشتر توضیح داده خواهند شد.
برچسب ها: mysql,pdo,solution
تابع get_mime
تابع زیر حاوی یک آرایه شامل پرکاربردین پسوندهاست که با دادن نام فایل میتونیم MIME Content-Type فایل رو بگیریم.
این تابع دو روش استاندارد رو امتحان میکنه در صورت نتیجه نگرفتن از آرایه استفاده میکنه.
/**
* Returns MIME Content-Type By filename
*
* @param string $filename File name or path
* @return string New MIME-Type
*/
function get_mime($filename) {
if(function_exists('finfo_file')) {
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $filename);
finfo_close($finfo);
return $mime;
}
if(function_exists('mime_content_type')) {
return mime_content_type($filename);
}
$map = array(
'txt'=>'text/plain','htm'=>'text/html',
'html'=>'text/html','php'=>'text/html',
'css'=>'text/css','js'=>'application/javascript',
'json'=>'application/json','xml'=>'application/xml',
'swf'=>'application/x-shockwave-flash',
'flv'=>'video/x-flv','png'=>'image/png',
'jpe'=>'image/jpeg','jpeg'=>'image/jpeg',
'jpg'=>'image/jpeg','gif'=>'image/gif',
'bmp'=>'image/bmp','tiff'=>'image/tiff',
'ico'=>'image/vnd.microsoft.icon',
'tif'=>'image/tiff','svg'=>'image/svg+xml',
'svgz'=>'image/svg+xml','zip'=>'application/zip',
'rar'=>'application/x-rar-compressed',
'exe'=>'application/x-msdownload',
'msi'=>'application/x-msdownload',
'cab'=>'application/vnd.ms-cab-compressed',
'mp3'=>'audio/mpeg','qt'=>'video/quicktime',
'mov'=>'video/quicktime','pdf'=>'application/pdf',
'psd'=>'image/vnd.adobe.photoshop',
'ai'=>'application/postscript',
'eps'=>'application/postscript',
'ps'=>'application/postscript',
'doc'=>'application/msword','rtf'=>'application/rtf',
'xls'=>'application/vnd.ms-excel',
'ppt'=>'application/vnd.ms-powerpoint',
'odt'=>'application/vnd.oasis.opendocument.text',
'ods'=>'application/vnd.oasis.opendocument.spreadsheet'
);
$ext = end( explode('.',strtolower($filename)) );
return (array_key_exists($ext, $map) ?
$map[$ext] : 'application/octet-stream');
}
// Examples
echo get_mime('F:/Wamp/www/test.zip'); // application/zip
echo get_mime('test.flv'); // video/x-flv
echo get_mime('http://boplo.ir/path/test.css'); // text/css
با تشکر از ایشون.
برچسب ها: function,solution
خوبها: آژاکس. بدها: آژاکس
AJAX تکنیک جذاب و مفیدی برای مدیریت صفحات سایت هست که غیر از جذابیت، سرعت انتقال محتوا رو بالا میبره و در پهنایباند صرفهجویی میکنه.
در ادامه به نکات متفاوتی از باید و نبایدها و خوبی بدیهای آژاکس اشاره خواهد شد.
وابستگی به جاوااسکریپت: مهمترین خصیصهی آژاکس وابستگی اون به زبان و کدهای جاوااسکریپته و این زبان هم کاملا به مرورگر وابسته است و مرورگر هم به کاربر. یعنی نمیشه روش حساب صددرصد باز کرد.
باید وابستگیها رو تحلیل و کنترل کنیم. اگر بخشهای حساسی رو به آژاکس وابسته کردیم مدل غیرآژاکسی هم باید براش ایجاد کنیم. و نباید کاربر رو نادیده بگیریم و در حالتهای خاص مثل غیرفعال بودن جاوااسکریپت یا بروز خطای جاوااسکریپت، هم جوابگوی نیازهای کاربر از سایت باشیم.
بارگذاری کامل صفحات توسط جاوااسکریپت: شاید وسوسه شیم و بخوایم صفحات سایت رو کاملا با آژاکس لود کنیم. این کار مهمترین خوبیای که داره سرعت بالای انتقال محتواست اما باید بدونیم که تغییر صفحات با آژاکس این مشکلات رو هم داره:
- عدم توانایی به استفاده از دکمههای Back و Forward و Bookmark مرورگر چون عملا هیچ تغییر صفحهای رخ نداده. برای حل این مشکل کدهای آمادهای وجود داره!
- عدم تولید URL متناسب با صفحه. کاربر نمیتونه آدرس صفحهای که داره میبینه رو ذخیره کنه یا به کسی بده چون آدرس صفحه تغییری نکرده. دقت کن که راه حلی که در بند قبلی اشاره کردم، با اینکه آدرس رو تغییر میده اما کافی نیست. به این دلیل که سایت هم باید آماده تحلیل و پردازش آدرسهای این چنینی باشه یعنی اگر کسی URL تولید شده توسط کدهای ما رو اجرا کرد اطلاعات صحیح رو ببینه.
- موتورهای جستجو که جاوااسکریپت و آژاکس ندارند. اونهای برای ایندکس کردن صفحات از صفحات عادی استفاده میکنند. محتوایی که فقط با آژاکس قابل دسترسه یعنی برای هیچ موتور جستجویی قابل دسترس نیست. برای حل این مشکل باید امکان تغییر صفحات، بدون آژاکس رو هم فراهم کنیم که کار چندان سادهای نیست.
از هم گسیختگی کدها: کاملا مشخصه که فرایند آژاکس از دو طرف انجام میشه. سمت سرور و سمت کاربر. این یعنی یک عملیات آژاکس با همکاری دو زبان برنامهنویسی صورت میگیره. مثلا جاوااسکریپت و PHP.
حالا سوال پیش میاد که عملیات چطور بین این دو زبان تقسیم شه؟ چه کارهایی رو توسط جاوااسکریپت انجام بدیم و چه کارهایی رو به سرور محول کنیم؟
مثال میزنم. میخوایم یک درخواست آژاکس بفرستیم و رکوردی رو تغییر بدیم. میتونیم با شروع عملیات همه پردازشهای ممکن رو با جاوااسکریپت انجام بدیم و یه لقمهی آماده برای سرور ارسال کنیم یا برعکس، سادهترین مدل درخواست رو ارسال کنیم و در سرور همهی بررسیها رو انجام بدیم.
نکتهی بد مسئله اینجاست که معمولا سوالاتی که در این بند مطرح کردم هیچوقت مطرح نمیشه و طراح همینجوری شروع میکنه با طراحی آژاکس و نتیجه این میشه که سر در آوردن از یک عملیات، کار وحشتناکی شده چرا که بخشی از پردازشها در سمت سرور صورت گرفته و بخشی سمت کاربر.
برای حل این مشکل باید تکلیفمون رو با خودمون و کارمون روشن کنیم و براساس یک قاعدهای رفتار کنیم. بدستگیری عملیات در سمت کاربر، سایت رو به سیستم کاربر و جاوااسکریپت وابسته میکنه و ترافیک سرور رو کمتر میکنه. در مقابل، سنگینی کار در سمت سرور، قابلیت حمل رو بیشتر میکنه، سرعت عملیات رو میتونه زیاد کنه و البته پردازشهای بیشتری رو به سرور محول میکنه. روش سوم تعریف روشی بین این دو روش هست که باید همهجا بهش پایبند باشیم یعمی مثلا کارهای خاصی رو تعریف کنیم که همیشه توسط جاوااسکریپت انجام شه و کارهایی توسط سرور.
امنیت: نکتهای که فراموش میشه. بعضیها برای آژاکس فقط پارامترهای اساسی رو ارسال میکنند و در سرور مطمئن هستند که این اطلاعات از همون کاربری که باید، رسیده. مثلا میخوان چیزی رو آپدیت کنند فقط اطلاعات اساسی رو ارسال میکنند و تغییر رو انجام میدهند در حالیکه باید و باید صحت ارسالکننده رو هم تایید کنند. حتما باید چک بشه که چه کسی این درخواست رو ارسال کرده. دسترسی داشته یا نه.
تغییر بخشهای کوچک و مهم: بهترین استفادهی آژاکس ارسالهای کوچک است. در واقع باید بگردیم و آژاکس رو فقط برای چنین نقاطی فعال کنیم. مثلا ثبت کامنت، معمولا ثبت کامنت لازم نیست محتوای کل صفحه رو مجدد بازخوانی کنه یا عملیات Rate یا تغییرات این چنینی که کاربر دوست نداره واسه حرکت اضافی زیاد معطل شه.
بهینگی: از خصوصیات پسندیدهی آژاکس سرعت بالا بخاطر عدم لود اطلاعات اضافی است. یعنی مثلا من توسط آژاکس یک کامنت ثبت میکنم. اطلاعاتی رو ارسال میکنم و محتوای یک کامنت رو از سرور میگیرم. اما وقتی بدون آژاکس چنین کاری میکنم، اطلاعات یک کامنت رو ارسال کردم ولی محتوای یک صفحهی کامل و از سرور میگیرم! حجم خیلی کمتری توسط آژاکس لود شده پس سریعتره.
حالا باید دقت کنیم که در سرور اطلاعات اضافیای ارسال نکنیم که این خصوصیت رو ار بین ببریم. مثلا گاهی به اطلاعاتی از چند نقطهی صفحه نیاز داریم و کل صفحه رو لود میکنیم و توسط جاوااسکریپت اطلاعات مورد نیاز رو ازش استخارج میکنیم. برای چنین کاری باید از XML و یا JSON استفاده کنیم و فقط اونهایی رو که لازم داریم دریافت کنیم نه چیزی بیشتر.
استفاده از کتابخانههای آژاکس: وقتی کدهای اصلی آژاکس رو نشناسیم یا با جاوااسکریپت راحت نباشیم، سراغ کتابخانههای جاوااسکریپت میریم تا از توابع آمادهی اونها استفاده کنیم. کتابخانههایی مثل MooTools یا jQuery. نکتهی مهم در استفاده از این کتابخانهها اینه که اینها حجم قابل توجهی رو به سایت اضافه میکنند و به نظر من باید ارزش این موضوع رو داشته باشند. آژاکس معمولا فقط یکی از امکانات این کتابخانههاست و قابلیتهای زیادی به همراه آنها بوجود میاد. بهتره از قابلیتهای آنها استفاده بیشتری در سایت کنیم یعنی از یک کتابخانه صرفا برای آژاکس استفاده نکنیم.
پست مرتبط: بیایم AJAX یاد بگیریم.....
موفق باشید
برچسب ها: ajax,solution,tutorial
YADC) Yet Another Date Converter)
من دو سال پیش تابع ()date در PHP رو به شکل یک کلاس شمسی کردم و در این سایت قرار دادم. یه سری داونلود کردند و احتمالا استفاده کردند. حالا نسخه جدید این کلاس رو با امکانات بیشتر می تونید دریافت کنید یا نمونه قدیمی خودتون رو بروز کنید. تغییرات در نسخه 2.0.0 به شکل زیر هستند:
- اضافه شدن متد جدید برای شبیه سازی تابع ()mktime
- اضافه شدن متد جدید برای شبیه سازی تابع ()getdate
- رفع باگ
- اضافه شدن امکان نمایش اعداد بصورت فارسی
نکته مهم اینکه نام کلاس و نام متد date تغییر کرده ولی این کلاس با نمونه های قبلی هم سازگاره یعنی اگر قصد بروزرسانی کلاس رو داری لازم نیست بری هرجا کلاس رو استفاده کردی، تغییر بدی. کافیه کلاس جدید رو با نمونه قبلی تعویض کنی.
کلی توضیح و تفسیر داریم که تو دنباله مطلب بخون و همونجا داونلود کن.
برچسب ها: function,solution
< قبلیبعدی >