• 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
کلاس سشن
#1
با سلام


یک کلاس برای session با کمک اینترنت نوشتم میخواستم بدونم چه ایراداتی داره

کد:
class session
{


public function __construct()
{
    $this->init();
}    
    public static function init()
    {
        session_start();
    }
    
    
    public static function set($key,$value)
    {
        $_SESSION[$key]=$value;
    }
    
    public static function get($key)
    {
        if (isset($_SESSION[$key]))
        {
            if (!empty($_SESSION[$key]))
            {
                return $_SESSION[$key];
            }
            else
            {
                return false;
            }
        }
        
        return false;
    }
    
    
    public static function destory()
    {
        session_unset();
        session_destroy();
    }
    
}
  پاسخ
تشکر شده توسط :
#2
ایراداتی داره ، اینکه هر بار یه object بسازی از کلاس session ، تابع session_start اجرا میشه و اجرای یک بار بیشترش خطا میده
ایراد بعدیش اینه کلاست خیلی ساده است یخورده روش کار کن
مثلا به کلیدهات یه رشته یونیک ترکیبی از یوزرایجنت و آی پی کاربر اضافه کن .
  پاسخ
تشکر شده توسط : hamid_80386 ayoubsys
#3
نقل قول:ایراداتی داره ، اینکه هر بار یه object بسازی از کلاس session ، تابع session_start اجرا میشه و اجرای یک بار بیشترش خطا میده


در مورد ایراد اول: از کلاس نمونه های زیادی ایجاد و تست کردم ولی خطایی نداد خودمم روی این قضیه شک دارم

چرا خطا نمیده ؟؟؟؟

کد:
session::set('name','iman');
session::set('email','www@eewe.co');
session::set('age','28');


echo session::get('name');echo "<br>";

echo session::get('email');echo "<br>";
echo session::get('age');echo "<br>";

نقل قول:مثلا به کلیدهات یه رشته یونیک ترکیبی از یوزرایجنت و آی پی کاربر اضافه کن .

منظورتون از یونیک چیه اینو متوجه نشدم !!!
اگر منظورتون اینه یک کلید منحصر بفرد (uniqid) برای هر سشن ایجاد کنم و با کلید اصلی joint کنم ، بعدا اگه بخوام سشن رو فراخوانی کنم و کلید یونیک رو ندونم که مشکل ایجاد میشه
میشه یک مثال ساده بزنی شاید من اشتباه متوجه شدم


یه چیز جالب اینکه من اومدم تو متد init() دستور session_start(); رو غیر فعال کردم اما با کمال تعجب بازم سشن ها ثبت میشن !!!
  پاسخ
تشکر شده توسط :
#4
نقل قول: در مورد ایراد اول: از کلاس نمونه های زیادی ایجاد و تست کردم ولی خطایی نداد خودمم روی این قضیه شک دارم
شما دارید بصورت متد استاتیک استفاده میکنید

اینو تست کنید
کد پی‌اچ‌پی:
$ses1 = new session;
$ses1->set('name','iman');



$ses2 = new session;
$ses2->set('age',28); 


نقل قول: منظورتون از یونیک چیه اینو متوجه نشدم !!!
برای جلوگیری از حملات session و امنیت اسکریپت

یه سناریو رو میگم تحلیلش کنید
فرض کنید شما روی دامین example.ir یه اسکریپت دارید و پنل مدیریتش ادمین داره و لاگین بودن ادمین رو با چک کردن موجود بودن سشن is_admin ست کردین
حالا روی آدرس example.ir/blog باز هم یه اسکریپت نصب کردین و چک کردن لاگین بودن رو با سشن is_admin چک کردین

حالا مشکلی که پیش میاد ، کسی که توی example.ir لایگن میکنه و is_admin بارش ثبت میشه روی دومی هم همین is_admin ثبت هست و لاگین حساب میشه اونجا که نباید اینطوری باشه
درسته؟
  پاسخ
تشکر شده توسط : ImanAzadi ayoubsys
#5
نقل قول:شما دارید بصورت متد استاتیک استفاده میکنید

دلیل اینکه من از متد استاتیک استفاده میکنم اینه که دارم یه فریم ورک کوچولو مینویسم و برای لود کلاس های مختلف یک autoloader با spl_autoload_register نوشتم
تابع spl_autoload_register فقط با متدهای استاتیک کار میکنه

چرا در روش استاتیک خطا نمیده اینو نمیفهمم ؟؟؟؟؟ (یعنی با این روش متد init فقط یکبار اجرا شده که خطا نمیده ؟)

درسته که در متدهای استاتیک نیازی به نمونه سازی نیست ولی آیا این به این مفهوم است که بعد از پایان عملیات متد ، حافظه هنوز درگیره ؟؟؟؟

اگر با این روش خطایی وجود نداره چه دلیلی هست که بخوام تغییر بدم کلاس رو ؟؟؟

قسمت دوم رو گرفتم و ممنون از اینکه وقت گذاشتی عزیز دل انگیز
  پاسخ
تشکر شده توسط :
#6
نقل قول:دلیل اینکه من از متد استاتیک استفاده میکنم اینه که دارم یه فریم ورک کوچولو مینویسم و برای لود کلاس های مختلف یک autoloader با spl_autoload_register نوشتم
تابع spl_autoload_register فقط با متدهای استاتیک کار میکنه
کلید واژه static رو قبل از متد تعریف کنید

کد پی‌اچ‌پی:
static public function set(){} 

نقل قول: چرا در روش استاتیک خطا نمیده اینو نمیفهمم ؟؟؟؟؟ (یعنی با این روش متد init فقط یکبار اجرا شده که خطا نمیده ؟)
اصلا اجرا نمیشه Tongue

وقتی بصورت
کد پی‌اچ‌پی:
$ses1 = new session;
$ses1->set('name','iman'); 
استفاده کنین متد __construct اجرا میشه که توش تعریف کردین بره به init و توی init اومدین session_start زدین
بعد میره متد set رو اجرا میکنه و الباقی داستان

اما وقتی بصورت استاتیک خود متد رو set رو صدا میزنید
کد پی‌اچ‌پی:
session::set('name','iman'); 
دیگه متد __construct اجرا نمیشه !!!
Big Grin
  پاسخ
تشکر شده توسط : ayoubsys
#7
نقل قول:کلید واژه static رو قبل از متد تعریف کنید


Confused
متدهای کلاس ، استاتیک تعریف شدند Big Grin ولی چون من موقع زدن این تاپیک ، دسترسی به کلاس نوشته شده نداشتم ، سریع متدهای اصلی رو تو خود تاپیک دستی نوشتم و فراموش کردم استاتیک رو بنویسم
بعد فکر کنم static رو باید بعد از public نوشت نه قبل از اون

پست اول اصلاح شده و کلید static اضافه گردید
کد:
public static function set(){}

پس با این اشتباهی که پیش اومده ما از ابتدای تاپیک جفتمون داریم راه خودمون رو میریم Big GrinBig GrinTongue
شما فکر کردید که متدها public هست در صورتیکه static بودن
برای همین فرمودید

نقل قول:شما دارید بصورت متد استاتیک استفاده میکنید

نقل قول:کلید واژه static رو قبل از متد تعریف کنید

ولی این اشتباه رو داشتم که متد init رو در construct تعریف کردیم در صورتیکه طبق گفته شما فراخوانی استاتیک متد construct اجرا نمیشه

حالا بنظر شما تابع init رو کجا تعریف کنم که زمانی که متد set یا get فراخوانی شد دستور session_start(); اجرا بشه ؟؟؟؟
  پاسخ
تشکر شده توسط :
#8
نقل قول:دلیل اینکه من از متد استاتیک استفاده میکنم اینه که دارم یه فریم ورک کوچولو مینویسم و برای لود کلاس های مختلف یک autoloader با spl_autoload_register نوشتم
تابع spl_autoload_register فقط با متدهای استاتیک کار میکنه
کد پی‌اچ‌پی:
$obj = new session;
spl_autoload_register(array($obj'init')); 
نقل قول:بعد فکر کنم static رو باید بعد از public نوشت نه قبل از اون
Dodgy

نقل قول:حالا بنظر شما تابع init رو کجا تعریف کنم که زمانی که متد set یا get فراخوانی شد دستور session_start(); اجرا بشه ؟؟؟؟
متد استاتیک نذار ، یخورده باحالترش کن ، کلاس singleton بنویس Big Grin
  پاسخ
تشکر شده توسط : ayoubsys


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان