PDA

View Full Version : سوال: آرگومان برای توابع کلاسها



smart_twists
چهارشنبه 22 خرداد 1392, 07:38 صبح
سلام
دوستان و اساتید عزیز من در زمینه شی گرایی یکم مشکل دارم. یک کلاس برای بخش کاربران نوشتم که یه سری توابع درونش هست.
سوال من اینه که واسه توابع باید از صفات کلاس استفاده کرد یا اینکه آرگومان ورودی داشته باشند؟!! مثلا واسه تابع Add کد زیر ، روش استاندارد چی هست؟!!

برای مثال من برای حذف یک کاربر ابتدا یک شی از کلاس میسازم و بعد تابع SetID رو فراخوانی میکنم و بعد تابع Delete رو فراخوانی میکنم. آیا این روش درستی هست؟!! روش استاندارد چیه؟!!



<?php

/**
* Description of users
*
* @author Saeed
*/
require_once 'connection.php';

class users {

private $_id;
private $_username;
private $_password;
private $_status;
private $_email;
private $_tell;
private $_signupdate;
private $connection;

function __construct() {
$this->connection = new connection();
$this->connection->ConnectDB();
}

function __destruct() {
$this->connection->DisconnectDB();
}

public function setID($id) {
$this->_id = $id;
}

public function getID() {
return $this->_id;
}

public function setUsername($username) {
$this->_username = $username;
}

public function getUsername() {
return $this->_username;
}

public function setPassword($password) {
$this->_password = $password;
}

public function getPassword() {
return $this->_password;
}

public function setStatus($status) {
$this->_status = $status;
}

public function getStatus() {
return $this->_status;
}

public function setEmail($email) {
$this->_email = $email;
}

public function getEmail() {
return $this->_email;
}

public function setTell($tell) {
$this->_tell = $tell;
}

public function getTell() {
return $this->_tell;
}

public function setSignupdate($signupdate) {
$this->_signupdate = $signupdate;
}

public function getSignupdate() {
return $this->_signupdate;
}

public function Add($username, $password, $status, $email, $tell) {
setUsername($username);
setPassword($password);
setStatus($status);
setEmail($email);
setTell($tell);

$query = "INSERT INTO users (`username`, `password`, `status`, `email`, `tell`) VALUES ('$this->_username', '$this->_password', '$this->_status', '$this->_email', '$this->_tell')";
if (mysql_query($query)) {
return TRUE;
} else {
return FALSE;
}
}

public function Delete() {
$query = "DELETE FROM users WHERE id = '$this->_id'";
mysql_query($query);
}

public function SelectOne() {
$query = "SELECT * FROM users WHERE id = '$this->_id'";
$result = mysql_query($query);
$user = mysql_fetch_array($result);
return $user;
}

public function SelectAll() {
$query = "SELECT * FROM users";
$result = mysql_query($query);

while ($user = mysql_fetch_array($result)) {
$users[] = $user;
}

return $users;
}

public function Edit() {
$query = "UPDATE users SET username = '$this->_username', password = '$this->_password', status = '$this->_status', email = '$this->_email', tell = '$this->_tell', signupdate = '$this->_signupdate' WHERE id = '$this->_id'";
mysql_query($query);
}

public function CheckUsername() {
$query = "SELECT * FROM users WHERE username = '$this->_username'";
$result = mysql_query($query);

if (mysql_num_rows($result))
return TRUE;
else
return FALSE;
}

public function CheckPassword() {
$query = "SELECT * FROM users WHERE username = '$this->_username' AND password = '$this->_password'";
$result = mysql_query($query);

if (mysql_num_rows($result))
return TRUE;
else
return FALSE;
}

public function GetGroup() {
$query = "SELECT `group`.* FROM `group`, users WHERE `group`.code = users.status AND users.username = '$this->_username'";
$result = mysql_query($query);
return mysql_fetch_array($result);
}

public function PendingCount() {
$query = "SELECT count(*) AS count FROM users WHERE status='1'";
$result = mysql_query($query);
$count = mysql_fetch_array($result);
return $count['count'];
}

public function AllPending() {
$query = "SELECT * FROM users WHERE status = '1'";
$result = mysql_query($query);
while ($user = mysql_fetch_array($result)) {
$users[] = $user;
}
return $users;
}

}

?>

smart_twists
چهارشنبه 22 خرداد 1392, 09:58 صبح
دوستان عزیز لطفا راهنمایی کنید

plague
چهارشنبه 22 خرداد 1392, 15:45 عصر
زیادی پیچیدش کردی
نیاز نیست تک تک صفات رو پرایوت بزاری ! فقط مواردی که ماهیتشون پرایوت باشه ... مثلا کانکشن
برای کلاس یوزر همه رو پابلیک بزار
روش استاندارد تر اینه که یه شی بسازی از یوزر
صفاتش رو مقدار دهی کنی
بعد تابع add رو فراخانی کنی برای شی


$u = new user ;
$u->username = 'xx';
$u->add();



روش گرفتن کاربرت هم درست نیست (SelectOne و SelectAll ) ...یعنی بهینه نیست
اینها باید یک شی از یوزر رو برگردونن وقتی از دیتبایس مشخصات رو خوندن نه اینکه رکورد دیتابیس رو برگردونه ... اینم یه دلیل دیگه که نباید صفات رو پرایوت بزاری

مورد دیگه اینکه توابعی مثل PendingCount و AllPending که نیاز به ساخته شدن شی ندارن رو به صورت استاتیک بزار

smart_twists
جمعه 24 خرداد 1392, 05:38 صبح
روش گرفتن کاربرت هم درست نیست (SelectOne و SelectAll ) ...یعنی بهینه نیست
اینها باید یک شی از یوزر رو برگردونن وقتی از دیتبایس مشخصات رو خوندن نه اینکه رکورد دیتابیس رو برگردونه ... اینم یه دلیل دیگه که نباید صفات رو پرایوت بزاری

مورد دیگه اینکه توابعی مثل PendingCount و AllPending که نیاز به ساخته شدن شی ندارن رو به صورت استاتیک بزار

خیلی ممنون از راهنمایی خیلی خوبی که کردی. چند روزی بود دنبال جواب این سوال بودم، خیلیا که سوادشونم بالا بود نمیتونستن راهنماییم کنن.

لطف میکنی اون دو مورد آخر هم که گفتی رو با مثال توضیح بدی؟!!

plague
جمعه 24 خرداد 1392, 15:17 عصر
مثلا تو تابع
SelectOne خیلی ساده بخام بگم به این شکل میشه


public function SelectOne() {
$query = "SELECT * FROM users WHERE id = '$this->_id'";
$result = mysql_query($query);
$user_from_database = mysql_fetch_array($result);

$user = new $user;
$user->username = $user_from_database['username'];
$user->id = $$user_from_database['id'];
// بقيه موارد هم به همين شکل
return $user;
}





یا اونیکی سلکت آل




public function SelectAll() {

$query = "SELECT * FROM users";
$result = mysql_query($query);

while ($user_row = mysql_fetch_array($result)) {
$user = new $user;
$user->username = $user_row['username'];
$user->id = $$user_row['id'];
$users[] = $user;
}

return $users;
}





اینجوری نتیجه برگشتی یه شی خواهد بود و شما مثلا میتونی مستقیما بقیه توابع مثل دیلیت رو روش پیاده سازی کنی


$user = new user;
$user->id = 5 ;
$user_selected = $user1->SelectOne();
$user_selected->delete();


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


کافیه که بعد خوندن یوزر از دیتابیس نتایج دیتبایس رو بفرستی به این تابع و یه شی تحویل بگیری از اون نتایج


static private function make_object($records){
$object_array = array();
while($row = mysql_fetch_array($records)){

$object = new users;
foreach($row as $key=>$val){
if($object->has_attr($key))
$object->$key = $val ;
}

$object_array[] = $object ;
}
return $object_array ;
}

private function has_attr($key){
$object_vars = get_object_vars($this);
return array_key_exists($key , $object_vars );
}





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

نمیخام زیاد پیچیدش کنم فعلا همیناییکه گفتم رو نگاه کن تا متوجه بشی چی به چیه ولی دوتابع SelectOne و SelectAll هم بهتره استاتیک بشن با این روشیکه من گفتم اگه بازنویسی بشن
چون قراره یه شی برگردونن از نتایج دیتابیس
پس اون شی اولیه که برای فراخانی تابع میسازید بی استفاده میشه و بهینه تر خواهد بود که نباشه اون


$user1 = new user;
$user1->id = 5 ;
$user2 = $user1->SelectOne();


var_dump($user1);
var_dump($user2);

الان user2 یه شی کامل و قابل استفاده هستش
ولی user1 بی استفادست و فقط به درد فراخانی میخوره

اگه تابع رو استاتیک بنویسی اینجوری میشه که از همه نظر بهینه تر هستش


$user2 = user::SelectOne(5);
var_dump($user2);


----------------------------

کد ها رو همینجوری دستی نوشتم ممکنه اررور تایپی و سنتکس داشته باشن

smart_twists
سه شنبه 28 خرداد 1392, 08:41 صبح
Plague جان خیلی ممنون از جواب خیلی خوب و کاملی که دادی.
خیلی لطف کردی. :قلب: