3raser Posted April 3, 2012 Share Posted April 3, 2012 I have a questions regarding Singleton Pattern in this video: Using the singleton pattern, isn't possible to have methods that aren't static? In this video it shows nothing but static methods. Also, after creating the class object like so: $database = Database:Connect(); How would I go about using normal functions with that object? Say I had a query function. I can't do this: $database->query(); So what would I do? :/ - Thanks for any help regarding this. Quote Link to comment https://forums.phpfreaks.com/topic/260236-singleton-pattern/ Share on other sites More sharing options...
kicken Posted April 3, 2012 Share Posted April 3, 2012 You can create the non static functions like normal. Just you make the constructor and clone methods private so an external source can't create a new object. Then you provide your own static method to build the object. eg class DB { private static $sConn; private function __construct(){ } private function __clone(){ } public static function Connect(){ if (!self::$sConn){ self::$sConn = new self; } return self::$sConn; } public function query($sql){ echo $sql; } } Then your Connect static method returns the instance of the db class which you can then use to run the query method. $db = DB::Connect(); $db->query('blah'); Quote Link to comment https://forums.phpfreaks.com/topic/260236-singleton-pattern/#findComment-1333832 Share on other sites More sharing options...
3raser Posted April 3, 2012 Author Share Posted April 3, 2012 Thanks for that. I could've sworn I did something along those lines, but I probably messed up a step. And I have one more quick question (if you have the time for it): What's the point of singleton pattern? I mean, I know what it's purpose is and how it functions. But when would there ever be two of the same objects? EDIT: Also, using what you said - I get an error: Fatal error: Using $this when not in object context in C:\wamp\www\OSREMAKE\OSRemakeCleaned\structure\base.php on line 35 My base.php <?php /* * @INITIALIZER/BASE * ~~~~~~~~~~~~ * @FILE DESCRIPTION: In simple terms: it "starts" the website, and acts as the heart of the website * @LAST MODIFIED: March 27, 2012 * @INCLUDES: Database Class, Config */ class base { private static $instance; public $db; /* * @METHOD writeToFile * @DESC writes the specified string to a specified file * @DESC automatically creates file if it doesn't exist * * @PARAM string * @DESC an array containing the lines/strings we want to write to the file */ private function __construct() {} private function __clone() {} /* * SINGLETON PATTERN */ public static function createInstance() { if(!self::$instance) { self::$instance = new self; $this->db = new database($db_host, $db_name, $db_user, $db_password); } return self::$instance; } public function writeToFile($file, array $string) { $file_handle = fopen($file, 'a'); foreach($string as $string_to_write) { fwrite($string); } fclose($file_handle); } } ?> Quote Link to comment https://forums.phpfreaks.com/topic/260236-singleton-pattern/#findComment-1333835 Share on other sites More sharing options...
3raser Posted April 3, 2012 Author Share Posted April 3, 2012 Since I can't edit my post, I'll add-on to my above post with this reply: index.php <?php error_reporting(E_ALL ^ E_NOTICE); /* * @INDEX * ~~~~~~~~~~~~ * @FILE DESCRIPTION: Homepage * @LAST MODIFIED: April 3, 2012 */ include('includes/config.php'); include('structure/base.php'); include('structure/database.php'); $base = base::createInstance(); $base->db->test(); ?> Quote Link to comment https://forums.phpfreaks.com/topic/260236-singleton-pattern/#findComment-1333837 Share on other sites More sharing options...
KevinM1 Posted April 3, 2012 Share Posted April 3, 2012 The point of the Singleton Pattern is to create a global that can only be created once. By now alarms should be going off. It's unfortunate that the Singleton is usually presented as the first pattern, because it's hardly ever a good idea to use it. It's really an anti-pattern - something that looks neat and beneficial, but often winds up causing some form of damage it was meant to prevent. Really, you'd be better off forgetting about the pattern and learning something useful like the Factory Method or Composite Pattern. I'd say that 8/9 times out of 10, when someone thinks that using a Singleton is the best way to solve a problem, they should actually use Dependency Injection instead. Quote Link to comment https://forums.phpfreaks.com/topic/260236-singleton-pattern/#findComment-1333914 Share on other sites More sharing options...
trq Posted April 3, 2012 Share Posted April 3, 2012 As for your issue. You cannot use $this within a static method. This line: $this->db = new database($db_host, $db_name, $db_user, $db_password); belongs within your __construct(). Quote Link to comment https://forums.phpfreaks.com/topic/260236-singleton-pattern/#findComment-1333921 Share on other sites More sharing options...
3raser Posted April 3, 2012 Author Share Posted April 3, 2012 Thanks, I'll look into the above mentioned patterns and try to avoid using singleton. As for your issue. You cannot use $this within a static method. This line: $this->db = new database($db_host, $db_name, $db_user, $db_password); belongs within your __construct(). ============= Ah. I thought the singleton pattern doesn't allow the constructor to be used? Quote Link to comment https://forums.phpfreaks.com/topic/260236-singleton-pattern/#findComment-1334157 Share on other sites More sharing options...
trq Posted April 3, 2012 Share Posted April 3, 2012 I thought the singleton pattern doesn't allow the constructor to be used? It can't be accessible from outside (private), but you can still use it from within the class. Quote Link to comment https://forums.phpfreaks.com/topic/260236-singleton-pattern/#findComment-1334162 Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.