Обновить

Комментарии 15

мне тоже очень не хватает перегрузки. Эх
На func_num_args() я бы не стал надеяться, легко ошибиться в кол-ве параметров
Для решения поставленного примера лучше использовать ORM. Перегрузки методов действительно иногда очень не хватает, но на мой взгляд, в PHP лучше отказаться от этого механизма, т.к. это вносит больше путаницы
Под механизмом вы подразумеваете приведенные автором примеры или сам принцип перегрузки методом?
НЛО прилетело и опубликовало эту надпись здесь
Подпишусь.

Со временем не только полностью отказался от имитаций полиморфных функций, но даже от классов с объектами, идентифицируемыми множествами параметров.

Один объект — один идентификатор.

Всё остальное — свойства объекта…

А если требуется загрузка объектов из списка по ряду параметров, то этим уже ORM занимается. Скажем, то, что у автора темы идёт как

static function create($name,$price){… }

у меня будет:

$objects = objects_array('product', 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) {


ну не в названии же дело )
я там 2 параметра инициализировал потому

protected function initTwoParams($price,$name) {
сорри, я не придираюсь, просто в ооп не сильно силен=)
… пару строчками выше написано:
сорри, ноут чтоли глючит=(
… пару строчками выше написано:
$object->initThreeParams($name, $price)
потому и вопрос возник=)
Спасибо, я просто сначала хотел id ещё туда поставить, а потом передумал, а название функции забыл исправить
Что-то я не совсем понимаю пример, почему нельзя реализовать его так?
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);
		}
	}
	
}
если уж есть сильное желание запихать все в один объект.
Можно и так, это вариант со статичным методом.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации