Методи в класс

dakata__92

Super Moderator
Колеги, правилно ли съм драснал според вас тези методи? Трябва ли да има отделно сетер и гетер или и това което съм написал е правилно от гледна точка на ООП. :)
PHP:
public function getConnection($class = "\system\database\PDO",$dbname=null){
		if(in_array("system\interfaces\iDatabase",class_implements($class))){
			if(empty($this->dbConnection)){
				$cnf = $this->getConfiguration()->load('database/connection');
				if(is_null($dbname)){
					return $this->dbConnection = new $class($cnf['host'],$cnf['user'],$cnf['pass'],$cnf['name']);
				}
				return $this->dbConnection = new $class($cnf['host'],$cnf['user'],$cnf['pass'],$dbname);
			}
			return $this->dbConnection;
		}else{
			throw new \Exception("Class not implements the interface [system\interfaces\iDatabase].",500);
		}
	}
	
	public function getRouter($router = "\system\router\Router"){
		if(in_array("system\interfaces\iRouter",class_implements($router))){
			return new $router();
		}else{
			throw new \Exception("Class not implements the interface [system\interfaces\iRouter].",500);
		}
	}
 
Хмм.. абе напоследък все такива постове пускам, ам това:

PHP:
if(in_array("system\interfaces\iDatabase",class_implements($class))

няма ли да е по-просто ако го напишеш така:

PHP:
if($class instanceof system\interfaces\iDatabase)
 
anonimen каза:
Хмм.. абе напоследък все такива постове пускам, ам това:

PHP:
if(in_array("system\interfaces\iDatabase",class_implements($class))

няма ли да е по-просто ако го напишеш така:

PHP:
if($class instanceof system\interfaces\iDatabase)
Четох по темата и казват, че в някой състояния това може да доведе до някакво объркване и се препоръчвал този начин. :) Иначе и аз бих го ползвал нооо на доста места казват, че било грешно и затова си имало функция. Помогнете ми да преправя тези методи правилно, че нещо съм забил.
 
http://www.php-fig.org/psr/psr-1/
http://www.php-fig.org/psr/psr-2/
като за начало.

Също така забелязвам това при теб:

Код:
if(проверка за правилно) {
   ....
   if(друга проверка) {
       ...
   }
   return ...;
}
else {
   throw ...
}

Защо не проверяваш директно за грешка и директно да хвърляш ексепшън? Също така няма нужда от else в случая.
 
djman каза:
http://www.php-fig.org/psr/psr-1/
http://www.php-fig.org/psr/psr-2/
като за начало.

Също така забелязвам това при теб:

Код:
if(проверка за правилно) {
   ....
   if(друга проверка) {
       ...
   }
   return ...;
}
else {
   throw ...
}

Защо не проверяваш директно за грешка и директно да хвърляш ексепшън? Също така няма нужда от else в случая.

PHP:
public function getConnection($class='\system\database\PDO',$dbname=null){
		if(!in_array('system\interfaces\iDatabase',class_implements($class))){
			throw new \Exception('Class not implements the interface [system\interfaces\iDatabase].',500);
		}
		if(empty($this->dbConnection)){
			$cnf = $this->getConfiguration()->load('database/connection');
			if(empty($dbname)){
				return $this->dbConnection = new $class($cnf['host'],$cnf['user'],$cnf['pass'],$cnf['name']);
			}
			return $this->dbConnection = new $class($cnf['host'],$cnf['user'],$cnf['pass'],$dbname);
		}
		return $this->dbConnection;
	}
 
Такаааа драснах това:

PHP:
public function getConnection($class='\system\database\PDO',$dbname=null){
		if($this->implementsInteface('system\interfaces\iDatabase',$class) and empty($this->dbConnection)){
			$cnf = $this->getConfiguration()->load('database/connection');
			if(empty($dbname)){
				$this->dbConnection = new $class($cnf['host'],$cnf['user'],$cnf['pass'],$cnf['name']);
			}
			$this->dbConnection = new $class($cnf['host'],$cnf['user'],$cnf['pass'],$dbname);
		}
		return $this->dbConnection;
	}
	
	public function getRouter($router='\system\router\Router'){
		if($this->implementsInteface('system\interfaces\iRouter',$router)){
			return new $router();
		}
	}
	
	public function implementsInteface($interface,$class){
		if(!in_array($interface,class_implements($class))){
			throw new \Exception("Class not implements the interface [$interface].",500);
		}
		return true;
	}
 
Не знам какво ти / ми става но ми се струва че непрекъснато пишеш излишен код :D

PHP:
if (empty($dbname)) {
    $this->dbConnection = new $class($cnf['host'], $cnf['user'], $cnf['pass'], $cnf['name']);
}

$this->dbConnection = new $class($cnf['host'], $cnf['user'], $cnf['pass'], $dbname);
може просто така:

PHP:
if(empty($dbname))
   $dbname = $cnf['name'];

$this->dbConnection = new $class($cnf['host'], $cnf['user'], $cnf['pass'], $dbname);

Ключовата дума reusable :!:

П.п. а защо не едитнеш system\PDO класа и не го направиш да приема един аргумент $config и сам вътре да си извлича нещата?
 
Дааа пред очите ми е било. :!:

PHP:
public function getConnection($class='\system\database\PDO',$dbname=null){
		if($this->implementsInteface('system\interfaces\iDatabase',$class) and empty($this->dbConnection)){
			$cnf = $this->getConfiguration()->load('database/connection');
			if(empty($dbname)){
				$dbname = $cnf['name'];
			}
			$this->dbConnection = new $class($cnf['host'],$cnf['user'],$cnf['pass'],$dbname);
		}
		return $this->dbConnection;
	}
	
	public function getRouter($router='\system\router\Router'){
		if($this->implementsInteface('system\interfaces\iRouter',$router)){
			return new $router();
		}
	}
	
	public function implementsInteface($interface,$class){
		if(!in_array($interface,class_implements($class))){
			throw new \Exception("Class not implements the interface [$interface].",500);
		}
		return true;
	}
 
implementsInterface throw-ва? Защо просто не връщаш in_array(...,...) ? И подобен метод, ако е нужен, трябва да е по-скоро private/protected, защото май не се вписва в самия клас.
 
А защо трещиш ексепшън в implementsInterface? Логически погледнато е по-добре да връща само true/false...

НО! Ако искаш да го оставиш с ексепшъна, проверката по-горе е излишна:

if($this->implementsInteface('system\interfaces\iDatabase',$class) and empty($this->dbConnection))

Защото ImplementsInterface винаги връща true :)

излишен код... : -)
 
anonimen каза:
А защо трещиш ексепшън в implementsInterface? Логически погледнато е по-добре да връща само true/false...

НО! Ако искаш да го оставиш с ексепшъна, проверката по-горе е излишна:

if($this->implementsInteface('system\interfaces\iDatabase',$class) and empty($this->dbConnection))

Защото ImplementsInterface винаги връща true :)

излишен код... : -)
Ъъъъъ да досетих се след малко мислене. Впрочем Вие как бихте постъпили? Заааа това, че е public да ще го направя при всяко положение ще е private. :) :) :)
Все пак според мен е хубаво да се throw-ва съобщение иначе как ще разбере програмиста какъв е проблема?
 
dakata__92 каза:
Четох по темата и казват, че в някой състояния това може да доведе до някакво объркване и се препоръчвал този начин. :) Иначе и аз бих го ползвал нооо на доста места казват, че било грешно и затова си имало функция.
References, please :) Че аз нещо не намерих...

Защото ако го ползваш него, ще ти бъде по-лесно да направиш горното :?:

btw. намерих нещо, което май ще свърши работа - http://www.php.net/manual/en/function.is-subclass-of.php

if(is_subclass_of($class, 'system\PDO')) {}
 
anonimen каза:
dakata__92 каза:
Четох по темата и казват, че в някой състояния това може да доведе до някакво объркване и се препоръчвал този начин. :) Иначе и аз бих го ползвал нооо на доста места казват, че било грешно и затова си имало функция.
References, please :) Че аз нещо не намерих...

Защото ако го ползваш него, ще ти бъде по-лесно да направиш горното :?:
http://stackoverflow.com/questions/17662456/usefulness-of-using-class-implements-vs-instanceof
Тоест class_implements освен на инстанцията на класът открива и по името на класът, тоест по стринга. Не е нужно да правиш допълнителна инстанция и да товариш паметта, нужно е само да подадеш стринга с името. Естествено и на инстанция може да бъдат намерени имплементираните интерфейси. При instanceof е нужно да имаш винаги обект.
 
Мисля, че почвам да разбирам...
Все си мислех, че $class e обект, сега се усетих че е стринг.
Ок ясно :)
 
anonimen каза:
Мисля, че почвам да разбирам...
Все си мислех, че $class e обект, сега се усетих че е стринг.
Ок ясно :)
Ако беше обект няма проблем смисъл в този случай дали ще подам обект или стринг няма да има проблем да използвам метода. :)
 
dakata__92 каза:
anonimen каза:
Мисля, че почвам да разбирам...
Все си мислех, че $class e обект, сега се усетих че е стринг.
Ок ясно :)
Ако беше обект няма проблем смисъл в този случай дали ще подам обект или стринг няма да има проблем да използвам метода. :)
Мен ми се въртеше нещо в главата да направиш така, но явно в твоя случай няма да стане:

PHP:
public function getConnection (\system\PDO $class, $dbname = null) { }
//edit - Имах предвид това:
public function getConnection (\system\interfaces\iDatabase $class, $dbname = null) { }

Демек да кажеш че искаш \system\PDO (edit: system\interfaces\iDatabase) инстанция, в този случай полиморфизмът ще си свърши работата :)
 
Да но това няма ли да иска обект? Аз подавам стринговото име класът не инстанция. По дефаулт ще си е \system\database\PDO но може да бъде и подаден примерно \system\database\MySQLi.
 
Ползвай интерфейс, и искай да се подава обект, който е имплементирал него

public function getConnection(DatabaseInterface $db, ...)

чисто
 
djman каза:
Ползвай интерфейс, и искай да се подава обект, който е имплементирал него

public function getConnection(DatabaseInterface $db, ...)

чисто
Аз точно това имах предвид по-горе, ама нещо съм се отплеснал :D- \ system\PDO вместо \system\interfaces\iDatabase, но даката явно не ще ...
 

Back
Горе