В прошлом я использовал собственные классы для очень многих вещей. Я знаю, что есть stdClasses, предоставляемые самим PHP.
Поэтому я думаю, что было бы более эффективно использовать их для небольших объектов, потому что мне не нужно создавать сотни новых классов («вспомогательных классов»).
Пример:
public function getStatus() {
$status = new Status("1", "success");
return $status
}
учебный класс:
class Status
{
private $id;
private $name;
public function __construct($id, $name)
{
$this->id = $id;
$this->name = $name;
}
public function getId()
{
return $this->id;
}
public function getName()
{
return $this->name;
}
}
(как видите, единственная причина, по которой мне нужны такие классы, — это «возвращать» данные)
Поэтому, когда я пишу каждый раз так, как я сказал, мне приходится создавать много классов для небольшого использования.
Не лучше ли использовать объекты stdClass в таких случаях, как мой? Каковы минусы этой идеи?
Как для меня лучше использовать помощники / классы, такие как ArrayObject, Data, DataAccess и т. Д.
Идея этих помощников / классов — быстрое хранение и доступ к данным.
Я никогда не использую объекты stdClass. Даже если я использую такие функции, как json_decode, я устанавливаю второй аргумент true, чтобы получить массив массивов вместо массива stdClasses.
Надеюсь, что вы меня понимаете. Извините за плохой английский 🙂
Например:
/**
* @package com_zoo
* @author YOOtheme http://www.yootheme.com
* @copyright Copyright (C) YOOtheme GmbH
* @license http://www.gnu.org/licenses/gpl.html GNU/GPL
*/
/**
* Class for reading and writing in various formats
*
* @package Framework.Classes
*/
class AppData extends ArrayObject
{
/**
* Class constructor
*
* @param array $data The data array
*/
public function __construct($data = array())
{
parent::__construct($data ? $data : array());
}
/**
* Checks if the given key is present
*
* @param string $name The key to check
*
* @return boolean If the key was found
*
* @since 1.0.0
*/
public function has($name)
{
return $this->offsetExists($name);
}
/**
* Get a value from the data given its key
*
* @param string $key The key used to fetch the data
* @param mixed $default The default value
*
* @return mixed The fetched value
*
* @since 1.0.0
*/
public function get($key, $default = null)
{
if ($this->offsetExists($key)) {
return $this->offsetGet($key);
}
return $default;
}
/**
* Set a value in the data
*
* @param string $name The key used to set the value
* @param mixed $value The value to set
*
* @return AppData The AppData object itself to allow chaining
*
* @since 1.0.0
*/
public function set($name, $value)
{
$this->offsetSet($name, $value);
return $this;
}
/**
* Remove a value from the data
*
* @param string $name The key of the data to remove
*
* @return AppData The AppData object itself to allow chaining
*
* @since 1.0.0
*/
public function remove($name)
{
$this->offsetUnset($name);
return $this;
}
/**
* Magic method to allow for correct isset() calls
*
* @param string $name The key to search for
*
* @return boolean If the value was found
*
* @since 1.0.0
*/
public function __isset($name)
{
return $this->offsetExists($name);
}
/**
* Magic method to get values as object properties
*
* @param string $name The key of the data to fetch
*
* @return mixed The value for the given key
*
* @since 1.0.0
*/
public function __get($name)
{
return $this->offsetGet($name);
}
/**
* Magic method to set values through object properties
*
* @param string $name The key of the data to set
* @param mixed $value The value to set
*
* @since 1.0.0
*/
public function __set($name, $value)
{
$this->offsetSet($name, $value);
}
/**
* Magic method to unset values using unset()
*
* @param string $name The key of the data to set
*
* @since 1.0.0
*/
public function __unset($name)
{
$this->offsetUnset($name);
}
/**
* Magic method to convert the data to a string
*
* Returns a serialized version of the data contained in
* the data object using serialize()
*
* @return string A serialized version of the data
*
* @since 1.0.0
*/
public function __toString()
{
return empty($this) ? '' : $this->_write($this->getArrayCopy());
}
/**
* Utility Method to serialize the given data
*
* @param mixed $data The data to serialize
*
* @return string The serialized data
*
* @since 1.0.0
*/
protected function _write($data)
{
return serialize($data);
}
/**
* Find a key in the data recursively
*
* This method finds the given key, searching also in any array or
* object that's nested under the current data object.
*
* Example:
* <code>
* $data->find('parentkey.subkey');
* </code>
*
* @param string $key The key to search for. Can be composed using $separator as the key/subkey separator
* @param mixed $default The default value
* @param string $separator The separator to use when searching for subkeys. Default is '.'
*
* @return mixed The searched value
*
* @since 1.0.0
*/
public function find($key, $default = null, $separator = '.')
{
$key = (string)$key;
$value = $this->get($key);
// check if key exists in array
if ($value !== null) {
return $value;
}
// explode search key and init search data
$parts = explode($separator, $key);
$data = $this;
foreach ($parts as $part) {
// handle ArrayObject and Array
if (($data instanceof ArrayObject || is_array($data)) && isset($data[$part])) {
if ($data[$part] === null) {
return $default;
}
$data =& $data[$part];
continue;
}
// handle object
if (is_object($data) && isset($data->$part)) {
if ($data->$part === null) {
return $default;
}
$data =& $data->$part;
continue;
}
return $default;
}
// return existing value
return $data;
}
/**
* Find a value also in nested arrays/objects
*
* @param mixed $needle The value to search for
*
* @return string The key of that value
*
* @since 1.0.0
*/
public function searchRecursive($needle)
{
$aIt = new RecursiveArrayIterator($this);
$it = new RecursiveIteratorIterator($aIt);
while ($it->valid()) {
if ($it->current() == $needle) {
return $aIt->key();
}
$it->next();
}
return false;
}
/**
* Return flattened array copy. Keys are <b>NOT</b> preserved.
*
* @return array The flattened array copy
*
* @since 1.0.0
*/
public function flattenRecursive()
{
$flat = array();
foreach (new RecursiveIteratorIterator(new RecursiveArrayIterator($this)) as $value) {
$flat[] = $value;
}
return $flat;
}
}$array = array(
'simple' => 'very simple array',
'big' => array(
'bigbig' => array(
'bigbigbig' => 'third level'
)
)
);
$data = new AppData($array);
echo $data->get('simple'); // very simple array
echo $data->find('big.bigbig.bigbigbig'); // third level
echo $data->get('not_found', 'novalue'); // novalue
Других решений пока нет …