PDA

View Full Version : گفتگو: کلاس لاگین



masiha68
سه شنبه 07 آبان 1392, 22:20 عصر
سلام
من دارم روی مبحث شی گرایی کار می کنم و در حال یاگیری هستم
واسه کار هم می خوام یک کلاس لاگین بنویسم که طرح کلیش به شکل زیره


<?php
class login
{
public $username;
public $pasword;
public $ip;
public $state;
public $error;
function setusername($usename)

{
$this-> username=$usename;
return username;
}
function setpasword($pasword)
{
$this->pasword=$pasword;
return pasword;
}
function setip($ip)
{
$this-> ip=$ip;
return ip;
}
function setstate($state)
{
$this-> state=$state;
return state;
}
function seterror($error)
{
$this->error=$error;
return error;

}
function geterror()
{
echo $this->error;

}
function getlogin()
{


if(strlen($this->pasword)<6)
{


return $this-> seterror( "pass shoma kamtar az 6 harf ast");

}
else
{
if($this->pasword =="1234567" and $this->username =="pop")
{
return $this->seterror("welcome admin");
}
else
{
return $this->seterror("ur pass or user name is not true");
}
}





return error;
}
}

$login=new login();
$login->setip('10.114.7.7');
$login->setusername("pop");
$login->setpasword("1234567");
$login->setip("10.114.7.7");
$login->setstate("admin");
$login->getlogin();
$login->geterror();

?>


از دوستانی که oop کار کردن تقاضا دارم یه نگاهی به کد بندازن ببین که کجاهاش اشتباه و از روی اصول نوشته نشده و اینکه چه چیزهایی دیگه ای لازم داره
با تشکر

Tarragon
سه شنبه 07 آبان 1392, 22:29 عصر
سلام
این بهتره :
<?php
class login
{
public $username, $pasword,$ip,$state,$error;
function geterror()
{
echo $this->error;

}
function getlogin()
{


if(strlen($this->pasword)<6)
{


return $this-> seterror( "pass shoma kamtar az 6 harf ast");

}
else
{
if($this->pasword =="1234567" and $this->username =="pop")
{
return $this->seterror("welcome admin");
}
else
{
return $this->seterror("ur pass or user name is not true");
}
}





return error;
}
}

$login=new login();
$login->setip = '10.114.7.7';
$login->setusername = "pop";
$login->setpasword = "1234567";
$login->setip = "10.114.7.7";
$login->setstate = "admin";
$login->getlogin();
$login->geterror();

هر چند در صورتی که بصورت ارایه این هارو بدید خیلی بهتره.

masiha68
سه شنبه 07 آبان 1392, 22:41 عصر
پس شکل کلی کارهام درسته ... شما فقط خلاصه کردید ... البته این فقط یک مثاله ...
حالا اگه من بخوام روی هر داده که به کلاس فرستاده میشه تغییراتی بدم بهتره نیست از تابع ها واسه ی ست و گت استفاده کنم . مثلا بخوام یوزنیم رو اسکیپ کنم و یا ای پی رو تبدیل به عدد کنم
در مورد "هر چند در صورتی که بصورت ارایه این هارو بدید خیلی بهتره. " یه توضیح بدین ممنون می شم

masiha68
سه شنبه 07 آبان 1392, 22:47 عصر
پس شکل کلی کارهام درسته ... شما فقط خلاصه کردید ... البته این فقط یک مثاله ...
حالا اگه من بخوام روی هر داده که به کلاس فرستاده میشه بهتره نیست از تابع ها واسه ی ست و گت استفاده کنم . مثلا بخوام یوزنیم رو اسکیپ کنم و یا ای پی رو تبدیل به عدد کنم
در مورد "هر چند در صورتی که بصورت ارایه این هارو بدید خیلی بهتره. " یه توضیح بدین ممنون می شم

AliRezaPro
چهارشنبه 08 آبان 1392, 10:06 صبح
با این کار کل شی گرایی و انکپسولیشن و همینطور امنیت زیر سئوال رفت متاسفانه

public $username, $pasword,$ip,$state,$error;


مبحث مهمی که در شی گرایی وجود دارد بحث انکپسولیشن است . یعنی کسی از بیرون نباید دسترسی مستقیم به عناصر اصلی داشته باشد . و اینکه اصلا لازم هم نیست . برای این کار یک پروپرتی درست کنید که فقط مقدار را برگشت دهد.
در اینجا ما مقادیری چون پسورد و ... داریم که اصلا نیاز نیست بصورت پابلیک تعریف شود . عنصر به این مهمی باید حتما با پرپرتی کار کنند

masiha68
چهارشنبه 08 آبان 1392, 11:30 صبح
در مورد پابیلک که موافقم ولی در مورد اینکه واسه یه برگشتی نباد یه پروپرتی بنویسم نه ... شاید الان لازم نباشه که روی داده هیچ کار خاصی انجام بشه ولی شاید فردا خواستم کلاس رو گسترش بدیم

یه سوال داشتم ... ما توی هر پروژه از چندین کلاس داریم ... حالا اگه توی یکی از کلاس ها به چندتا از کلاس ها نیاز باشه (مثلا توی همین کلاس لاگین به کلاس دیتابیس و تاریخ شمسی و شاید هم useraction و ... ) چه جوری این کلاس ها رو به هم ربط می دیم . منظورم چطوری به متدها و یا مقادیر یک کلاس از داخل کلاس دیگه دسترسی پیدا می کنیم ... می دونم میشه از ربطه ی expends و parent استفاده کرد ولی وقتی تعداد کلاس های مورد نیاز زیاد باشه به نظرم کارایی ای رابطه از دست میره
شاید باید تموم کلاس ها و دادهای تولیدیشون رو به یک کلاس بالاتر نسبت داد که همه ی کلاس های دیگه از نسبت به اون کلاس بالات حالت فرزندی داشته باشن و در صورتی که یکی از فرزندها به داده ها یا متد های یکی دیگه از فرزند ها نیاز داشته باشه درخواست رو به کلاس بالاتر می فرسته و اون کلاس بالاتر داده ها رو واسه فرزند درخواست کننده از فرزند مورد درخواست می گیره (خودم هنگ کردم. :) )
شایدم روش بهتری وجود داره که ممنون می شم بگید

Mostafa_G2
چهارشنبه 08 آبان 1392, 15:18 عصر
سلام
فرض میکنیم که شما کلاسهای database و users و login رو دارید
کلاس database رو به کلاس users اکستند (extends) مکنید و کلاس users رو به کلاس login:



<?php
class database {

}
?>




<?php
class users extends database {

}
?>




<?php
class login extends users {

}
?>


بیشتر در رابطه با مباحث شی گرایی بخونید

یه مثال کوچیک از شی گرایی

فرض کنید شما یه property تو کلاس database تعریف کردین
اگه شما اون property رو به صورت private تعریف کرده باشد تو هیجا نمیتو نید ازش استفاده کنید جز خود همون کلاس.
ولی اگر شما این property رو protected مشخص کرده باشید هم توی کلاس users میتونید استفاده کنید و هم توی کلاس login ولی بیرون از کلاس نمی تونید ازش اسفاده کنید چون حفاظت شده هست.
ولی اگه public باشد همجا میتونید ازش اسفاده کنید.
این مساله در رابطه با method ها هم صدق میکنه.
توضیح بیشتر خواستی بگو.

masiha68
چهارشنبه 08 آبان 1392, 15:33 عصر
الان مشکل من بین رویه گرایی و شی گرایی اینه که شما توی رویه گرایی همه ی تابع ها رو میریزی توی یه فایلی و اونو هرجا اینکود کنی هر تابعی رو خواستی می تونی اجرا کنی ولی در مورد شی گرایی شما تابع ها رو بلوکه بندی می کنی و ازشون کلاس میزاری ولی نمی دونم ارتباط بین اینا چه جوریه ... مثلا توی کلاس لاگین من یه چندتا کلاس دیگه هم نیاز دارم که extands دوتا کلاس رو به هم وصل می کنی ولی بقیه رو چطور وصل کنیم ... در مورد پابلیک هم متوجه شدم .
مثلا اگه توی همین مثال اگه توی کلاس یوزر به اطلاعات دیتابیس و اطلاعات لاگین نیاز داشته باشی چطوری این متدها و اطلاعات رو بدست میاری و اینکه به نظرت کلاس بالاتر ( ارجاع همه ی متد و اطلاعات به کلاس پدری که همه ی کلاس ها نسبت به اون فرزند حساب میشه) چطوره ؟ مثلای توی همین مثال یه کلاس بذاریم وکلاس های لاگین و یوزر و دیتابیس رو فرزند اون قرار بدیم ...

navid3d_69
چهارشنبه 08 آبان 1392, 16:20 عصر
مثلا برای استفاده از کلاس دیتابیس می تونین یک متغیر توی کلاس تعریف کنید و شی کلاس دیتابیس رو توش بریزین و از اون استفاده کنید یا با استفاده از extends از اون کلاس استفاده کنید یا برای ارتباط چند کلاس درباره implements بیشتر بخونید ولی اون روش تعریف متغیر هم بعد نیست برای بعضی از قسمت ها یا بعضی از کلاس ها می تونن static باشن که راحت بشه استفاده کرد

Mostafa_G2
چهارشنبه 08 آبان 1392, 16:23 عصر
الان مشکل من بین رویه گرایی و شی گرایی اینه که شما توی رویه گرایی همه ی تابع ها رو میریزی توی یه فایلی و اونو هرجا اینکود کنی هر تابعی رو خواستی می تونی اجرا کنی ولی در مورد شی گرایی شما تابع ها رو بلوکه بندی می کنی و ازشون کلاس میزاری ولی نمی دونم ارتباط بین اینا چه جوریه ... مثلا توی کلاس لاگین من یه چندتا کلاس دیگه هم نیاز دارم که extands دوتا کلاس رو به هم وصل می کنی ولی بقیه رو چطور وصل کنیم ... در مورد پابلیک هم متوجه شدم .
مثلا اگه توی همین مثال اگه توی کلاس یوزر به اطلاعات دیتابیس و اطلاعات لاگین نیاز داشته باشی چطوری این متدها و اطلاعات رو بدست میاری و اینکه به نظرت کلاس بالاتر ( ارجاع همه ی متد و اطلاعات به کلاس پدری که همه ی کلاس ها نسبت به اون فرزند حساب میشه) چطوره ؟ مثلای توی همین مثال یه کلاس بذاریم وکلاس های لاگین و یوزر و دیتابیس رو فرزند اون قرار بدیم ...

این رو از خودت بپرس:
آیا میشه یه فرزند دو تا پدر داشته باشه؟
همینطور که نمیشه یه فرزند دوتا پدر داشته باشه یک کلاس هم نمیشه دو تا کلاس رو بهش extends کنیم.
اگه به یه همچین موردی برخوردی به نظرم باید یه آبجکت از کلاس مثلا login تعریف کنی بعد از توی کلاس user با کلمه کلیدی global ازش استفاده میکنی




<?php
global db;
db->query('SELECT...');
?>

masiha68
چهارشنبه 08 آبان 1392, 16:24 عصر
این رو از خودت بپرس:
آیا میشه یه پسر دو تا پدر داشته باشه؟

نه ... پس چاره چیه
الان من واسه کلاس لاگینم می خوام از دوتا کلاس دیگه استفاده کنم .. باید چیکار کنم . نمی دونم سوالم رو متوجه نمی شید یا خیلی بد دارم توضیح میدم ؟؟؟

navid3d_69
چهارشنبه 08 آبان 1392, 16:24 عصر
این پست رو ببنید کمکتون می کنه

http://blog.motane.lu/2012/01/21/multiple-inheritance-in-php/

Mostafa_G2
چهارشنبه 08 آبان 1392, 16:32 عصر
نه ... پس چاره چیه
الان من واسه کلاس لاگینم می خوام از دوتا کلاس دیگه استفاده کنم .. باید چیکار کنم . نمی دونم سوالم رو متوجه نمی شید یا خیلی بد دارم توضیح میدم ؟؟؟

باید از کلمه کلیدی global استفاده کنی
به همون ترتیبی که در پست بالا توضیح دادم
اگه مشکلی بود بگو کمک کنم

Mostafa_G2
چهارشنبه 08 آبان 1392, 16:48 عصر
require_once 'class.login.php'

<?php
class users extends db {

function test() {
global $login;
return $login->test1();
}

}
?>






<?php

class login extends users {
$test_prop;

function test1() {
return $test_prop;
}
}

?>

$login = new login();

masiha68
پنج شنبه 09 آبان 1392, 08:50 صبح
من برای ارتباط کلاس ها از روش navid3d_69 استفاده کردم و حالا یه سوال واسم پیش اومد ... فرض کنید ما کلاس دومی رو توی اولی فراخوانی کردیم و تونستیم به متدهاش دسترسی پیدا کنیم با استفاده از
$ip= $this-> useraction->getip();
حالا سوال من اینه اگه توی کلاس دومی که در کلاس اولی فراخوانی شده یه کلاس سومی وجود داشته باشه که اون کلاس سومی توی کلاس دومی فراخوانی شده ایا امکان دسترسی به متدهای کلاس سوم توی کلاس اول وجود داره؟

A->B->c
A->C??

و اینکه از نظر امنیتی امکانش هست در صورتی که کسی به کلاس اول دسترسی داشته باشه بتونه از کلاس سوم اطلاعات بگیره ؟
وقتی ما یک متغییر رو به صورت private تعریف می کنم امکان دسترسی به اون از خارج کلاس وجود داره (چه در صورتی که یک کلاس از اون ایجاد شده باشه و چه نشده باشه )؟