Как стать автором
Обновить

Метод, возвращающий весь объект

Время на прочтение 4 мин
Количество просмотров 678
Здравствуйте, уважаемые Знающие люди. Простите если я не туда разместил свой вопрос — делаю это впервые.

Вот я создал класс, который позволяет, как мне кажется, удобнее работать со списками данных. Удобство заключается в том, что объект в большинстве методов возвращает сам себя, что позволяет далее с ним играть. Используя Zend for Eclipse и комментарии к методам return asList я получаю кайф при работе со списками данных. Пример:

$obj = new asList;
print_r( $obj->
	set(array("my"=>"lol","dear"=>"rofl","mom"=>"hehe"))->
	intersect("hello,my,dear,friend")->
	merge("test,yo")->
	fillValuesFrom(array("yo"=>"good test"))->
	asArray() 
);

Возвращает:
Array ( [my] => [dear] => [test] => [yo] => good test )

Для javascript это нормально когда объект возвращает сам себя, но по какой-то странной причине я не смог обнаружить в том же google подобных классов на PHP. Это заставило задуматься может я чего-то не так делаю? Может такая реализация имеет большой проигрыш по скорости или ест много ресурсов? Вопрос к специалистам, стоит ли использовать такой подход (и кстати, как он правильно называется?)

Ниже идёт код класса.

<?php

/**
 * Associative List class
 * 
 */
class asList {
	
	private $_data;
	
	/**
	 * New associative list
	 *
	 * @param array||string $data (optional)
	 * @param string $clue (optional), if $data type == string
	 */
	function __construct($data = NULL, $clue = ",") {
		if (! is_null ( $data )) $this->set ( $data, $clue );
	}
	
	/**
	 * Private function to convert array||string to array
	 *
	 * @param array||string $array_or_string
	 * @param string (optional) $clue
	 * @return array
	 */
	private function _toArray($array_or_string, $clue = ",") {
		if (is_array ( $array_or_string )) {
			$array = $array_or_string;
		} elseif (is_string($array_or_string)) {
			$array_or_string = trim ( $array_or_string, $clue . " " );
			$keys = @explode ( $clue, $array_or_string );
			$array = array_fill_keys ( $keys, '' );
		}
		if (!is_array($array)) $array = array();
		unset ( $array [""] ); //data[] not allowed
		return $array;
	}
	
	/**
	 * Set data to work with
	 *
	 * @param arr||str $array_or_string
	 * @param string $clue
	 * @return asList
	 */
	public function set($array_or_string, $clue = ",") {
		$array = $this->_toArray ( $array_or_string, $clue );
		$this->_data = $array;
		return $this;
	}
	
	/**
	 * Export data as array
	 *
	 * @return array
	 */
	public function asArray() {
		return $this->_data;
	}
	
	/**
	 * Export data keys as string
	 *
	 * @param string (optional) $clue
	 * @return string
	 */
	public function asString($clue = ",") {
		return @implode ( $clue, @array_keys ( $this->_data ) );
	}
	
	/**
	 * Make string using $form
	 *
	 * @param string $selected
	 * @param string $form - use <key> <value> <selected> to place keys, values, selected string 
	 * @param string $clue
	 * @return string
	 */
	public function asStringAdvanced($selected = NULL, $form = "<option value='<key>'<selected>><value></option>", $clue = NULL ) {
		$data = (is_array($this->_data)) ? $this->_data : array();
		while (list($key,$val) = each ($data) ) {
			$data [$key] = str_replace ( 
				array ("<key>", "<value>", "<selected>" ), 
				array ($key, $val, ($key == $selected) ? " selected" : "" ), 
				$form 
				);
		}
		reset ( $data );
		return @implode ( $clue, $data );
	}
	
	
	/**
	 * Merge data with another data
	 *
	 * @param arr||str $array_or_string
	 * @param string(optional) $clue
	 * @return asList
	 */
	public function merge($array_or_string, $clue = ",") {
		$array1 = (is_array($this->_data)) ? $this->_data : array();
		$array2 = $this->_toArray ( $array_or_string, $clue );
		$this->_data = array_merge($array1,$array2);
		unset ( $this->_data [""] ); //data[] not allowed
		return $this;
	}

	/**
	 * Intersect data with another data
	 * If array, forgot about it's keys, only values willbe used
	 *
	 * @param arr||string $array_or_string
	 * @param string (optional) $clue
	 * @return asList
	 */
	public function intersect($array_or_string, $clue = ",") {
		if (! is_array ( $array_or_string )) {
			$array = $this->_toArray ( $array_or_string, $clue );
			$array = array_keys ( $array );
		} else {
			$array = array_values ( $array_or_string );
		}
		foreach ($array as $val) {
			if ( isset($this->_data[$val]) ) $ret[$val] = $this->_data[$val];
		}
		$this->_data = $ret;
		return $this;
	}
	
	/**
	 * Fill data with datas from $array
	 *
	 * @param array $array - associative array where to get new data from
	 * @param bool $preserve_original_if_not_exists - preserves original value if new array have no such key
	 * @return asList
	 */
	public function fillValuesFrom($array, $preserve_original_if_not_exists = true) {
		while ( list ( $key, ) = @each ( $this->_data ) ) {
			if ($preserve_original_if_not_exists && ! array_key_exists ( $key, $array )) {
				//preserve original
			} else {
				$this->_data [$key] = $array [$key];
			}
		}
		reset ( $this->_data );
		return $this;
	}

	/**
	 * Remove data with given keys
	 * If array in argument, values willbe used for list of keys to be removed
	 *
	 * @param arr||string $array_or_string - list of keys
	 * @param string (optional) $clue
	 * @return asList
	 */
	public function remove($array_or_string,$clue=",") {
		if (! is_array ( $array_or_string )) {
			$array = $this->_toArray ( $array_or_string, $clue );
			$array = array_keys ( $array );
		} else {
			$array = array_values ( $array_or_string );
		}
		foreach ($array as $item) {
			unset ($this->_data[$item]);
		}
		return $this;
	}
	
	public function exists($key) {
		return (isset($this->_data[$key])) ? true : false;
	}
}

?>

Теги:
Хабы:
+6
Комментарии 30
Комментарии Комментарии 30

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн