Ciao,
sto cercando di far funzionare un pattern in modo che mi passi una variabile tramite un oggetto, ma a quanto pare questa non viene proprio vista, anche se non mi viene riportato un errore dal PHP.
In pratica sto implementando un'interfaccia in grado di selezionare un modello di database ( in PDO ) tramite un'implementazione dello Strategy Pattern.
Codice PHP:
// iStrategy
interface iPDO_connect
{
public function connect($user = '');
}
// Context
class PDO_connect
{
private $_strategy;
public function __construct(iPDO_connect $strategy)
{
$this->_strategy = $strategy;
}
public function connect()
{
if (!isset($this->_strategy)) {
return '';
}
$this->_strategy->connect($this);
}
}
// Concrete Strategy
class PDO_MySQL implements iPDO_Connect
{
public function connect($user = '')
{
try
{
if ( $user = '') {
throw new Exception('L\'utente deve essere definito!');
}
$dsn = 'mysql:host=localhost;dbname=x;charset=utf8';
$password = 'la mia pass';
$connection = new PDO($dsn, $user, $password);
$connection->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$connection->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
$connection->setAttribute(PDO::ATTR_AUTOCOMMIT, true);
$connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
return $connection;
}
catch (PDOException $e)
{
$exception = 'Exception! ' . $e->getCode(). ': '. $e->getMessage(). ' in '. $e->getFile(). ' on line '. $e->getLine(). "\n\n";;
echo $exception;
exit;
}
}
}
L'uso è banale e se voglio modificare il motore del database, ad esempio passare a sqlite o altro mi basta modificare la classe concrete strategy.
La chiamata è pure banale
Codice PHP:
$context = new PDO_connect(new PDO_MySQL());
$handle = $context->connect('marco');
Ma l'errore che riporta non lo è 
Exception! 1045: SQLSTATE[HY000] [1045] Access denied for user ''@'localhost' (using password: YES) in C:\WWW\Z\bin\PDO_connect.class.php on line 43
La linea 43 non è altro che
Codice PHP:
$connection = new PDO($dsn, $user, $password);
Quindi?
Quindi sembra che la variabile $user non passa.
Inutile dire che se metto $user='marco' all'interno del metodo l'errore scompare a garantire il fatto che la procedura è giusta e l'errore non è nel PDO.
Quindi?