PDA

View Full Version : استفاده از الگوی singleton در php



png_92
یک شنبه 30 خرداد 1395, 11:41 صبح
سلام
من میخوام تو برنامم که با phpه از الگوی singleton استفاده کنم ولی نمیدونم چجوری باید بکار بگیرم. ی سوال دارم که اگه من ۳تا کلاس داشته باشم آیا باید فقط ی کلاس singleton داشته باشم
و بقیه ازون ارث ببرن؟ مثلا واسه کلاس connection من که کدش اینه :


class Database
{
private $host = "localhost";
private $db_name = "dbname";
private $username = "username";
private $password = "password";
public $conn;

public function dbConnection()
{

$this->conn = null;
try
{
$this->conn = new PDO("mysql:host=" . $this->host . ";dbname=" . $this->db_name, $this->username, $this->password);
$this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $exception)
{
echo "Connection error: " . $exception->getMessage();
}

return $this->conn;
}
}

و اینم نمونه کد singleton :



class Singletone {

public static function getInstance() {
static $instance = null;
if (null === $instance) {
$instance = new static();
}

return $instance;
}

protected function __construct() {

}

private function __clone() {

}

private function __wakeup() {

}

}


اگه میشه راهنمایی کنید که چطور استفاده از این الگو ؟
آیا اگه من تو کلاسای دیگه بخوام از connection استفاده کنم , اونجا چجوری ی object بسازم ازش؟
مرسی

H:Shojaei
دوشنبه 31 خرداد 1395, 11:48 صبح
نمونه (http://barnamenevis.org/showthread.php?99235-%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-%D8%A7%D9%84%DA%AF%D9%88%D9%87%D8%A7%DB%8C-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-Design-Pattern&p=486550&viewfull=1#post486550) و لینک آموزش (http://www.yamaghani.com/Files/11201343457.pdf)

H:Shojaei
دوشنبه 31 خرداد 1395, 12:01 عصر
و تا جایی که من فهمیدم و خودم هم الآن با این مساله آشنا شدم اینطوره که شما همون کلاسی که میخواید فقط در لحظه یک شی ازش ساخته بشه رو سینگلتون میکنید حالا اگر ۳ کلاس دارید که میخواید سینگلتون باشن میتونید واسه هرکدوم همین کار رو انجام بدین و روش کار هم اینطوریه که یه کانستراکت محدود یا private تعریف میکنید و یک متغیر اون هم private و static وقتی اولین شی از کلاس ساخته میشه متغیر رو برابر true میکنید و اگر دوباره کلاس صدا زده شد و این متغیر true بود اجازه ساخت object جدید داده نمیشه....

hamedarian2009
دوشنبه 31 خرداد 1395, 18:05 عصر
من قبلا یک نمونه ساده تر و قابل درک تر رو نوشته بودم قرار میدم اگه بدردتون خورد استفاده کنید



class Singleton
{

protected static $instance = [];

protected static $valid = [
'Config',
'Router',
'Session',
'Validator',
];

public static function make($class)
{
//Check valid class
if (!in_array($class, self::$valid)) {
throw new Exception("'{$class}' is not a valid class!");
}

//Create new instance
if (empty(self::$instance[$class])) {
self::$instance[$class] = new $class;
}
return self::$instance[$class];
}
}

//Usage
class Config
{
public function getUrl()
{
return 'http://example.com';
}
}

try {

$config = Singleton::make('Config');
echo $config->getUrl();

} catch (Exception $e) {
echo $e->getMessage();
}

png_92
سه شنبه 01 تیر 1395, 16:31 عصر
میشه تو درست کردن کلاس دیتابیسم کمک کنید؟
این چیزیه که من نوشتم ولی نمیدونم مشکل چیه که درست کار نمیکنه!
این کد کلاس دیتابیس:


class Database {

private $_connection;
private static $_instance;
private $host = "localhost";
private $db_name = "dbname";
private $username = "username";
private $password = "password";

public static function getInstance() {
if (!self::$_instance) {
self::$_instance = new self();
}
return self::$_instance;
}

private function __construct() {
$this->_connection = new PDO("mysql:host=" . $this->host . ";dbname=" . $this->db_name, $this->username, $this->password);
$this->_connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Error handling
if (mysqli_connect_error()) {
trigger_error("Failed to conencto to MySQL: " . mysql_connect_error(), E_USER_ERROR);
}
}

private function __clone() {

}

public function getConnection() {
return $this->_connection;
}

}

و این محل استفاده از کلاس دیتابیس:



if (isset($_POST['a'])) {
require_once './dbconfig.php';
$db = Database::getInstance();
$mysqli = $db->getConnection();
$sql_query = "SELECT name FROM film";
$result = $mysqli->query($mysqli);

$num_rows = $result->rowCount();
echo $num_rows;
if ($num_rows > 0) {

echo "</br>" . $num_rows . "</br>";
echo "</br><table><tr><th>Name</th></tr>";

while ($row = $result->fetch(PDO::FETCH_ASSOC)) {

echo "<tr><td>" . $row['name'] . "</tr>";
}
echo "</table>";
} else {
echo "Nothing found !";
}
}

png_92
سه شنبه 01 تیر 1395, 17:52 عصر
مشکل از اجرا نشدن کوئری بود.
از prepare و execute استفاده کردم واسه حلش.