Comments 15
мне тоже очень не хватает перегрузки. Эх
На func_num_args() я бы не стал надеяться, легко ошибиться в кол-ве параметров
Для решения поставленного примера лучше использовать ORM. Перегрузки методов действительно иногда очень не хватает, но на мой взгляд, в PHP лучше отказаться от этого механизма, т.к. это вносит больше путаницы
Под механизмом вы подразумеваете приведенные автором примеры или сам принцип перегрузки методом?
Подпишусь.
Со временем не только полностью отказался от имитаций полиморфных функций, но даже от классов с объектами, идентифицируемыми множествами параметров.
Один объект — один идентификатор.
Всё остальное — свойства объекта…
А если требуется загрузка объектов из списка по ряду параметров, то этим уже ORM занимается. Скажем, то, что у автора темы идёт как
static function create($name,$price){… }
у меня будет:
$objects = objects_array('product', array('name' => $name, 'price' => $price));
А все механизмы извлечения данных из БД — скрыты от конечного программирования. Это и вероятность ошибок снижает, и лёгкость смены бэкенда данных, и перемены в структурах БД в будущем…
Со временем не только полностью отказался от имитаций полиморфных функций, но даже от классов с объектами, идентифицируемыми множествами параметров.
Один объект — один идентификатор.
Всё остальное — свойства объекта…
А если требуется загрузка объектов из списка по ряду параметров, то этим уже ORM занимается. Скажем, то, что у автора темы идёт как
static function create($name,$price){… }
у меня будет:
$objects = objects_array('product', array('name' => $name, 'price' => $price));
А все механизмы извлечения данных из БД — скрыты от конечного программирования. Это и вероятность ошибок снижает, и лёгкость смены бэкенда данных, и перемены в структурах БД в будущем…
еще вариант
ну и можно просто ассоциированый массив или объект передавать и проверять установлены ли соответствующие ключи/свойства, правда тогда вызов не очень крассивый вида new Products(array('id') = $id) или new Products(array('name' => $name, 'price' => $price)), зато наиболее близко, имхо, к «классической» перегрузке
function __сonstruct($var, $price=0) { if (is_int($var)) { $id = $var; .... } else { $this->name = $var; $this->price = $price; } }
ну и можно просто ассоциированый массив или объект передавать и проверять установлены ли соответствующие ключи/свойства, правда тогда вызов не очень крассивый вида new Products(array('id') = $id) или new Products(array('name' => $name, 'price' => $price)), зато наиболее близко, имхо, к «классической» перегрузке
спасибо, только там в последнем примере не должно быть
вместо
protected function initTwoParams($price,$name) {
вместо
сорри, отправилось=(
может имелось в виду:
вместо
может имелось в виду:
protected function initThreeParams($price,$name) {
вместо
protected function initTwoParams($price,$name) {
Что-то я не совсем понимаю пример, почему нельзя реализовать его так?
если уж есть сильное желание запихать все в один объект.class Prodcuts { public $name; public $price; public $id; protected function __construct($id, $name, $price){ $this->id = $id; $this->name = $name; $this->price = $price; } public static function load($id) { $sql = "SELECT * FROM products WHERE id =$id"; $result = mysql_query($sql); $array = mysql_fetch_array($result); return new Prodcuts($id, $array['name'], $array['price']); } public static function create($name,$price){ $sql = "INSERT INTO poducts(name,price) VALUES ('$name','$price')"; if(mysql_query($sql)){ $id = mysql_insert_id(); return new Prodcuts($id, $name,$price); } } }
Sign up to leave a comment.
Перегрузка методов в php?