Reputation: 163262
One of the handy features of other languages is the ability to create get and set methods for properties. In trying to find a good way to duplicate this functionality in PHP, I stumbled across this: http://www.php.net/manual/en/language.oop5.magic.php#98442
Here is my breakdown of that class:
<?php
class ObjectWithGetSetProperties {
public function __get($varName) {
if (method_exists($this,$MethodName='get_'.$varName)) {
return $this->$MethodName();
} else {
trigger_error($varName.' is not avaliable .',E_USER_ERROR);
}
}
public function __set($varName,$value) {
if (method_exists($this,$MethodName='set_'.$varName)) {
return $this->$MethodName($value);
} else {
trigger_error($varName.' is not avaliable .',E_USER_ERROR);
}
}
}
?>
My plan was to extend this class and define the appropriate get_someproperty()
and set_someproperty()
in this extended class.
<?php
class SomeNewClass extends ObjectWithGetSetProperties {
protected $_someproperty;
public function get_someproperty() {
return $this->_someproperty;
}
}
?>
The trouble is, the base class of ObjectWithGetSetProperties
is unable to see my method get_someproperty()
in SomeNewClass
. I always get the error, "key is not available".
Is there any way to resolve this, allowing the base class of ObjectWithGetSetProperties
to work, or will I have to create those __get()
and __set()
magic methods in each class?
Upvotes: 1
Views: 15105
Reputation: 1
<form id="fname" method="post">
<textarea name="sms" id="messageText"></textarea>
<input type="submit" name="smsbut" value="sms"/>
</form>
<script>
$(document).ready(function() {
$("#fname").submit(function()
{
var sms = $('#messageText').val();
$.ajax(
{
type: "POST",
url: "sms.php/?id=<?php echo $_SESSION['id']; ?>",
data: {userSms: sms},
dataType: "json",
success: function(result)
{
if (result["error"] != undefined)
{
}
else if (result["success"] != undefined)
{
$('#messageText').val("");
location.reload();
}
}
});
return false;
});
});
</script>
Upvotes: 0
Reputation: 15892
Try is_callable
instead. Example code-fragment:
<?php
date_default_timezone_set("America/Edmonton");
class A {
protected $_two="goodbye";
protected $_three="bye";
protected $_four="adios";
public function __get($name) {
if (is_callable(array($this,$m="get_$name"))) {
return $this->$m();
}
trigger_error("Doh $name not found.");
}
public function get_two() {
return $this->_two;
}
}
class B extends A {
protected $_one="hello";
protected $_two="hi";
protected $_three="hola";
public function get_one() {
return $this->_one;
}
public function get_two() {
return $this->_two;
}
public function get_three() {
return $this->_three;
}
public function get_four() {
return $this->_four;
}
}
$a=new a();
echo $a->one."<br />";//Doh one not found.
echo $a->two."<br />";//goodbye
echo $a->three."<br />";//Doh three not found.
echo $a->four."<br />";//Doh four not found.
$b=new b();
echo $b->one."<br />";//hello
echo $b->two."<br />";//hi
echo $b->three."<br />";//hola
echo $b->four."<br />";//adios
?>
(Updated to show where B
overrides A
)
Upvotes: 5
Reputation: 145482
That's not well documented (some mentions in the comments), but method_exists()
really only checks for method presence in the current class.
But you can use is_callable()
instead. It also verifies that the method not only exists, but is indeed allowed to be invoked:
if ( is_callable(array($this, $varName)) ) {
...
Upvotes: 3
Reputation: 3947
In your example, you'll need to declare the $_someproperty
property, like this
class SomeNewClass extends ObjectWithGetSetProperties {
protected $_someproperty;
public function get_someproperty() {
return $this->_someproperty;
}
}
Upvotes: 0