تابع‏های جادویی PHP 5

PHP 5 مفهومی با نام متدهای جادویی را معرفی کرده است که پشتیبانی PHP را از برنامه‏نویسی شی‏گرا بسیار افزایش و بهبود می‏دهد. در این نوشتار فهرست این توابع آمده و کد نمونه ساده‏ای از هر کدام نیز آورده شده است. در این نوشتار فرض بر این گذاشته شده است که شما پیش از این با OOP آشنا هستید. ولی با این حال با توجه به این که یکی از خوانندگان این نوشتار، دانش‏آموزانم هستند که تقریبا با OOP آشنایی ندارند، تلاش می‏کنم به شکلی همه فهم توضیح بدهم.

سازنده و ویرانگر: __construct و __destruct

گاهی لازم است که یک سری مقداردهی‏های اولیه در کلاسهایمان در زمان ساخته شدن آنها انجام بشود. نمونه:

class Book {
public $bookname;
public $author;

public function __construct($bookname, $author) {
$this->bookname = $bookname;
$this->author = $author;
}
public function __destruct(); {
echo "You don't like my book?";
}
}

$book1 = new Book('Learning PHP', 'Hoda');
echo $book1->bookname;

نکته: متدهای __construct و __destruct می‏بایست public تعریف شوند؛ چون که قرار است این متدها از بیرون فراخوانی شوند.

__call

این متد هنگامی فراخوانی می‏شود که کاربرِ کلاس متدی را صدا بزند که در کلاس وجود ندارد. فرض کنید در که استفاده‏کننده کلاس متد Open را از کلاس Book که در بالا تعریف شده، فرا بخواند. در این صورت PHP که متد Open را پیدا نمی‏کند، متد __call را در صورت وجود صدا می‏زند و نام متدی که وجود نداشته و کاربر آن را فراخوانی کرده و پارامترهایی که کاربر صدا زده است را به متد __call می‏فرستد.

class Book {
function __call($data,$arguments) {
echo "Mehod Called: $data 
"; echo "Arguments: $arguments"; } } $book1 = new Book; echo $book1->open();

تابع‏های _get و _set

متد _get هنگامی فراخوانی می‏شود که مقدار یک ویژگی یا عضو کلاس تعریف نشده در کلاس خوانده بشود. تابع _set هم وقتی فراخوان می‏شود که در یک عضو یا ویژگی کلاس که تعریف نشده، مقداری ریخته بشود:

class Book {
function __get($data) {
echo "You asked to get member '$data'. But this member does not exist";
}
}

$book1 = new Book;
echo $book1->color;

تابع‏های __isset و __unset

تابع _isset هنگامی صدا زده می‏شود که کاربر بخواهد با تابع isset موجود در PHP چک کند که آیا یک ویژگی مقدار دارد یا نه. تابع _unset هم هنگامی صدا زده می‏شود که کاربر بخواهد با تابع unset موجود در PHP مقدار یک ویژگی را خالی کند.

class Book {
function __isset($var) {
echo "Variable '$var' is not set.";
}
function __unset($var) {
echo "Variable '$var' unset.";
}
}

$book1 = new Book;
isset($book1->color);
unset($book1->color);

تابع __sleep و __wakeup

تابع __sleep هنگامی صدا زده می‏شود که یک کلاس را در حال Serialize کردن هستیم. تابع __wakeup هم زمانی صدا زده می‏شود که یک کلاس را Deserialize می‏کنیم:

class Connection {
protected $link;
private $server, $username, $password, $db;

public function __construct($server, $username, $password, $db)
{
$this->server = $server;
$this->username = $username;
$this->password = $password;
$this->db = $db;
$this->connect();
}

private function connect()
{
$this->link = mysql_connect($this->server, $this->username, $this->password);
mysql_select_db($this->db, $this->link);
}

public function __sleep()
{
return array('server', 'username', 'password', 'db');
}

public function __wakeup()
{
$this->connect();
}
}

$conn1 = new Connection();
$conndata = serialize($conn1);

$conn2 = unserialize($conndata);

تابع __tostring

این تابع هنگامی فراخوانی می‏شود، که بخواهید یک کلاس را چاپ کنید:

class Book {
public $bookname;
public $author;

public function __construct($bookname, $author) {
$this->bookname = $bookname;
$this->author = $author;
}

function __tostring() {
return "Book Name: ".$this->bookname."
Book Author: ".$this->author; } } $book1 = new Book('Learning PHP', 'Hoda'); echo $book1;

نکته: تابع __tostring باید حتما یک مقدار را برگرداند.

تابع __invoke

این تابع هنگامی فراخوانی می‏شود که کاربر کلاس بخواهد یک کلاس را همانند یک تابع به کار بگیرد:

class Book {
function __invoke($value) {
print $value;
}
}

$book1 = new Book;
$book1();

نکته: این تابع تنها در PHP 5.3.0 به بالا در دسترس است. برای دیدن نسخه PHPی که در حال استفاده از آن هستید، می‏توانید تابع phpinfo() را به کار بگیرید.

__clone

در PHP 5 همانند زبانهای دیگر OOP اگر یک شی را به شی دیگری منتسب کنید، تنها یک Reference یا اشاره‏گر از شی اول در شی دوم ریخته می‏شود. به این ترتیب حافظه این دو شی یکسان است و اگر شما یکی از این اشیاء را پاک کنید، دیگری هم پاک خواهد شد. با کمک تابع clone می‏شود یک کپی از یک شی درست کرد و در شی دیگری ریخت. تابع clone موجود در PHP، تابع __clone کلاس را صدا می‏زند تا کار ریختن شی‏های داخلی کلاس اول انجام بشود.

تصویر مهدي

salam
مي خواستم بدونم ميشه هنگامي كه موس روي اسامي ركوردها در جدول ميره هاي لايت بشن مثل
phpmyadmin
البته در php
مثلادر اين جدوا چطوري اين كار رو بكنم ؟
<?php

if (isset($_POST['bkname']))
{

$db=mysql_pconnect("localhost","jahanar_medipol","1111");

if(!$db)
{
echo "error";
exit;
}
mysql_select_db('moftialshia');

mysql_query("SET NAMES 'utf8'", $db);
//$query="select*from tblbooks where bookname rlike '$rec'";

$srch=trim($_POST['bkname']);

$select=trim($_POST['select']);

if ($select===trim("نام كتاب"))

$query="select*from tblbooks where bookname rlike '$srch'";

elseif($select===trim("رديف"))

$query="select from tblbooks where radef rlike '$srch'";

elseif($select===trim("تعداد"))

$query="select from tblbooks where tedad rlike '$srch'";

elseif($select===trim("محقق"))

$query="select from tblbooks where esh rlike '$srch'";

//$query="select*from tblbooks where bookname rlike '$bknm' ";

$result=mysql_query($query);
if(!$result)
{
print("

");
exit;
}

$num=mysql_num_rows($result);
for($i=0;$i<$num;$i++)
{

$row=mysql_fetch_array($result);
echo "
";

echo "

$row[comment]

";
echo "

$row[salsal]

";

echo "

$row[chl]

";
echo "

$row[esh]

";
echo "

$row[lang]

";
echo "

$row[tedad]

";
echo "

$row[subject]

";
echo "

$row[writer]

";

echo "
$row[radef]

";
echo "
$row[gaf]

";
echo "

";

//echo "
"."

";

}

}

else

exit;

?>

تصویر mohsen

سلام
ببخشید برای استفاده از pattern ها در php چگونه باید عمل کرد

تصویر شاهزاده احمدی

Patternها بحثهای خیلی مفصلی دارند. شاید به زودی یک نوشته‏ای در این باره بنویسم.

تصویر پیام

عالی بود
دستتون درد نکنه
اگه در مورد فریم ورک symfony و نحوه نصبش توضیح بدید ممنون میشم

فرستادن دیدگاه تازه

پست الکترونیک شما نمایش داده نشده و به هیچ کسی نیز داده نمی‏شود.