Specifically, I would like to create an Array class and would like to overload the [] operator.
If you are using PHP5 (and you should be), take a look at the SPL ArrayObject classes. The documentation isn't too good, but I think if you extend ArrayObject, you'd have your "fake" array.
EDIT: Here's my quick example; I'm afraid I don't have a valuable use case though:
class a extends ArrayObject {
public function offsetSet($i, $v) {
echo 'appending ' . $v;
parent::offsetSet($i, $v);
}
}
$a = new a;
$a[] = 1;
+=
and use array_merge
on array objects (custom or spl)? The concept of holding array data in a centralised object (being able to be referenced instead of copied) theoretically is absolutely superior and should find more application - but lacking Interfaces to abstract all aspects of array behaviour makes the Spl*-Interface ecosystem feel rather half baked... –
Turgor Actually, the optimal solution is to implement the four methods of the ArrayAccess interface: http://php.net/manual/en/class.arrayaccess.php
If you would also like to use your object in the context of 'foreach', you'd have to implement the 'Iterator' interface: http://www.php.net/manual/en/class.iterator.php
PHP's concept of overloading and operators (see Overloading, and Array Operators) is not like C++'s concept. I don't believe it is possible to overload operators such as +, -, [], etc.
Possible Solutions
- Implement SPL ArrayObject (as mentioned by cbeer).
- Implement Iterator (if
ArrayObject
is too slow for you). - Use the PECL operator extension (as mentioned by Benson).
For a simple and clean solution in PHP 5.0+, you need to implements the ArrayAccess
interface and override functions offsetGet, offsetSet, offsetExists and offsetUnset. You can now use the object like an array.
Example (in PHP7+):
<?php
class A implements ArrayAccess {
private $data = [];
public function offsetGet($offset) {
return $this->data[$offset] ?? null;
}
public function offsetSet($offset, $value) {
if ($offset === null) {
$this->data[] = $value;
} else {
$this->data[$offset] = $value;
}
}
public function offsetExists($offset) {
return isset($this->data[$offset]);
}
public function offsetUnset($offset) {
unset($this->data[$offset]);
}
}
$obj = new A();
$obj[] = 'a';
$obj['k'] = 'b';
echo $obj[0], $obj['k']; // print "ab"
[]
operator on your object, implementing ArrayAccess
interface is the way to go. –
Froh It appears not to be a feature of the language, see this bug. However, it looks like there's a package that lets you do some sort of overloading.
Put simply, no; and I'd suggest that if you think you need C++-style overloading, you may need to rethink the solution to your problem. Or maybe consider not using PHP.
To paraphrase Jamie Zawinski, "You have a problem and think, 'I know! I'll use operator overloading!' Now you have two problems."
© 2022 - 2024 — McMap. All rights reserved.