Search
Write a publication
Pull to refresh

Comments 15

На func_num_args() я бы не стал надеяться, легко ошибиться в кол-ве параметров
Для решения поставленного примера лучше использовать ORM. Перегрузки методов действительно иногда очень не хватает, но на мой взгляд, в PHP лучше отказаться от этого механизма, т.к. это вносит больше путаницы
Под механизмом вы подразумеваете приведенные автором примеры или сам принцип перегрузки методом?
UFO landed and left these words here
Подпишусь.

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

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

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

А если требуется загрузка объектов из списка по ряду параметров, то этим уже 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);
		}
	}
	
}
если уж есть сильное желание запихать все в один объект.
Можно и так, это вариант со статичным методом.
Sign up to leave a comment.

Articles