protected function __construct($options = array(), $type = null) { static::$_handlers = array(static::RAW => function ($options) { return $options[0]; }, static::PARAMS => function ($options) { if (!empty($options[1]) && !is_array($options[1])) { $options[1] = array($options[1]); } return Query::insertParams($options[0], $options[1], isset($options[2]) ? $options[2] : true); }, static::SPRINTF => function ($options) { return call_user_func_array('sprintf', $options); }, static::GRAVES => function ($options) { return Query::graves($options[0]); }, static::VALUES => function ($options) { return 'VALUES(' . Query::graves($options[0]) . ')'; }, static::LIKE => function ($options) { if (count($options) >= 2) { return Query::graves($options[0]) . " LIKE '%" . Query::like($options[1]) . "%'"; } return "'%" . Query::like($options[0]) . "%'"; }, static::ENDS_LIKE => function ($options) { if (count($options) >= 2) { return Query::graves($options[0]) . " LIKE '%" . Query::like($options[1]) . "'"; } return "'%" . Query::like($options[0]) . "'"; }, static::STARTS_LIKE => function ($options) { if (count($options) >= 2) { return Query::graves($options[0]) . " LIKE '" . Query::like($options[1]) . "%'"; } return "'" . Query::like($options[0]) . "%'"; }, static::CALLBACK => function ($options, $query) { if (!$query || empty($options[0]) || !is_callable($options[0])) { return ''; } return call_user_func($options[0], $query); }); $type = $type ?: static::RAW; if (!isset(static::$_handlers[$type])) { throw new \Exception('Unknown expression type `$type`'); } $this->_type = $type; $this->_options = $options; }