* directly or indirectly (through an accessor get*, is*, or a magic
* method, __get, __call).
*
- * @param object $object
+ * @param object|array $object
* @param string $field
*
* @return mixed
return $object[$field];
}
- $accessors = array('get', 'is');
+ $accessors = ['get', 'is'];
foreach ($accessors as $accessor) {
$accessor .= $field;
return $object[$field];
}
+ if (isset($object->$field)) {
+ return $object->$field;
+ }
+
+ // camelcase field name to support different variable naming conventions
+ $ccField = preg_replace_callback('/_(.?)/', function($matches) { return strtoupper($matches[1]); }, $field);
+
+ foreach ($accessors as $accessor) {
+ $accessor .= $ccField;
+
+
+ if ( ! method_exists($object, $accessor)) {
+ continue;
+ }
+
+ return $object->$accessor();
+ }
+
return $object->$field;
}
public static function sortByField($name, $orientation = 1, \Closure $next = null)
{
if ( ! $next) {
- $next = function() {
+ $next = function() : int {
return 0;
};
}
- return function ($a, $b) use ($name, $next, $orientation) {
+ return function ($a, $b) use ($name, $next, $orientation) : int {
$aValue = ClosureExpressionVisitor::getObjectFieldValue($a, $name);
$bValue = ClosureExpressionVisitor::getObjectFieldValue($b, $name);
switch ($comparison->getOperator()) {
case Comparison::EQ:
- return function ($object) use ($field, $value) {
+ return function ($object) use ($field, $value) : bool {
return ClosureExpressionVisitor::getObjectFieldValue($object, $field) === $value;
};
case Comparison::NEQ:
- return function ($object) use ($field, $value) {
+ return function ($object) use ($field, $value) : bool {
return ClosureExpressionVisitor::getObjectFieldValue($object, $field) !== $value;
};
case Comparison::LT:
- return function ($object) use ($field, $value) {
+ return function ($object) use ($field, $value) : bool {
return ClosureExpressionVisitor::getObjectFieldValue($object, $field) < $value;
};
case Comparison::LTE:
- return function ($object) use ($field, $value) {
+ return function ($object) use ($field, $value) : bool {
return ClosureExpressionVisitor::getObjectFieldValue($object, $field) <= $value;
};
case Comparison::GT:
- return function ($object) use ($field, $value) {
+ return function ($object) use ($field, $value) : bool {
return ClosureExpressionVisitor::getObjectFieldValue($object, $field) > $value;
};
case Comparison::GTE:
- return function ($object) use ($field, $value) {
+ return function ($object) use ($field, $value) : bool {
return ClosureExpressionVisitor::getObjectFieldValue($object, $field) >= $value;
};
case Comparison::IN:
- return function ($object) use ($field, $value) {
- return in_array(ClosureExpressionVisitor::getObjectFieldValue($object, $field), $value);
+ return function ($object) use ($field, $value) : bool {
+ return in_array(ClosureExpressionVisitor::getObjectFieldValue($object, $field), $value, true);
};
case Comparison::NIN:
- return function ($object) use ($field, $value) {
- return ! in_array(ClosureExpressionVisitor::getObjectFieldValue($object, $field), $value);
+ return function ($object) use ($field, $value) : bool {
+ return ! in_array(ClosureExpressionVisitor::getObjectFieldValue($object, $field), $value, true);
};
case Comparison::CONTAINS:
return false !== strpos(ClosureExpressionVisitor::getObjectFieldValue($object, $field), $value);
};
+ case Comparison::MEMBER_OF:
+ return function ($object) use ($field, $value) : bool {
+ $fieldValues = ClosureExpressionVisitor::getObjectFieldValue($object, $field);
+ if (!is_array($fieldValues)) {
+ $fieldValues = iterator_to_array($fieldValues);
+ }
+ return in_array($value, $fieldValues, true);
+ };
+
+ case Comparison::STARTS_WITH:
+ return function ($object) use ($field, $value) : bool {
+ return 0 === strpos(ClosureExpressionVisitor::getObjectFieldValue($object, $field), $value);
+ };
+
+ case Comparison::ENDS_WITH:
+ return function ($object) use ($field, $value) : bool {
+ return $value === substr(ClosureExpressionVisitor::getObjectFieldValue($object, $field), -strlen($value));
+ };
+
+
default:
throw new \RuntimeException("Unknown comparison operator: " . $comparison->getOperator());
}
*/
public function walkCompositeExpression(CompositeExpression $expr)
{
- $expressionList = array();
+ $expressionList = [];
foreach ($expr->getExpressionList() as $child) {
$expressionList[] = $this->dispatch($child);
*
* @return callable
*/
- private function andExpressions($expressions)
+ private function andExpressions(array $expressions) : callable
{
- return function ($object) use ($expressions) {
+ return function ($object) use ($expressions) : bool {
foreach ($expressions as $expression) {
if ( ! $expression($object)) {
return false;
}
}
+
return true;
};
}
*
* @return callable
*/
- private function orExpressions($expressions)
+ private function orExpressions(array $expressions) : callable
{
- return function ($object) use ($expressions) {
+ return function ($object) use ($expressions) : bool {
foreach ($expressions as $expression) {
if ($expression($object)) {
return true;
}
}
+
return false;
};
}