1. Konstruktor jest w OOP dosyć specyficzną metodą. W PHP co prawda nie istnieją jakieś rygorystyczne "przepisy" odnośnie jego stosowania, ale nie zdziwiłbym się, gdyby używanie konstruktora jak zwykłej metody z czasem zaczęło skutkować jakimiś dziwnymi zachowaniami. Ponadto takie używanie konstruktora sprawiłoby, że Twój kod straciłby na czytelności.
2. Nic nie stoi na przeszkodzie aby zapisać to w taki sposób:
public function __construct($a, $b, $c, $d) {
$this->init($a, $b, $c, $d);
}
public function readdb($id) {
...
$this->init($row['a'], $row['b'], $row['c'], $row['d']);
}
private function init($a, $b, $c, $d) {
...
}
Nie tracisz absolutnie niczego, a Twój kod zaczyna być "standardowy" i czytelny.
3. Jednak, w ogóle metoda readdb() w żadnym wypadku nie powinna znaleźć się w tej kasie. Powinna być w innym obiekcie i zwracać (tworzyć) nowy obiekt:
class Article {
private $title;
private $content;
public function __construct($title, $content) {
...
}
gettery/setter
}
class ArticleDao {
private $conn;
public function __construct(PDO $conn) {
$this->conn = $conn;
}
public function findOne($pk) {
...
return new Article($row['title'], $row['content']);
}
}
4. Widzę, że ten kod ma służyć jako mapper rekordów z bazy danych na obiekty, tj. ORM. Od razu radzę skorzystać z gotowego, dobrego narzędzia (np. Doctrine), a nie pisać to samemu. ORM jest jednak dosyć rozbudowanym i skomplikowanym narzędziem, a zbudowanie którego potrzeba ogromu czasu, który można lepiej spożytkować.