class Database { private $pdo; public function __construct($options) { $this->pdo = new PDO( $options['dsn'], $options['username'], $options['password'], $options['options'] ); } public static function connect() { self::setOptions([ 'dsn' => 'mysql:host=localhost;dbname=testdb', 'username' => 'username', 'password' => 'password', 'options' => [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ] ]); return new self(); } private static function setOptions($options) { foreach($options as $key => $value) { self::$$key = $value; } } }
class Mailer { private $transport; public function __construct($options) { $this->transport = (new Swift_SmtpTransport( $options['host'], $options['port'], $options['encryption'] )) ->setUsername($options['username']) ->setPassword($options['password']); } public static function send($options) { self::setOptions([ 'host' => 'smtp.example.com', 'port' => 465, 'encryption' => 'ssl', 'username' => 'username', 'password' => 'password' ]); $mailer = new self($options); return $mailer->transport->send($options['message']); } private static function setOptions($options) { foreach($options as $key => $value) { self::$$key = $value; } } }In this example, we are defining a class called Mailer, which takes an array of options as an argument to its constructor. We are using the Swift Mailer library to send emails, and the options array contains the SMTP host, port, encryption, username, and password. We are also defining a static method called send, which calls self setOptions to set the mailer options, creates a new instance of the class with the user-specified options, and sends the message. Package Library: PDO, Swift Mailer