I am pretty sure that Ruby has these (equivalents for __call, __get and __set), because otherwise how find_by would work in Rails? Maybe someone could give a quick example of how to define methods that act same as find_by?
Thanks
When you call a method on an object of the Str class and that method doesn't exist e.g., length() , PHP will invoke the __call() method. The __call() method will raise a BadMethodCallException if the method is not supported. Otherwise, it'll add the string to the argument list before calling the corresponding function.
The __set() Method The __set() magic method is called when you try to set data to inaccessible or non-existent object properties. The purpose of this method is to set extra object data for which you haven't defined object properties explicitly.
in short you can map
php
class MethodTest {
  public function __call($name, $arguments) {
    echo "Calling object method '$name' with " . implode(', ', $arguments) . "\n";
  }
}
$obj = new MethodTest;
$obj->runTest('arg1', 'arg2');
ruby
class MethodTest
  def method_missing(name, *arguments)
    puts "Calling object method '#{name}' with #{arguments.join(', ')}"
  end
end
obj = MethodTest.new
obj.runTest('arg1', 'arg2')
php
class PropertyTest {
  //  Location for overloaded data.
  private $data = array();
  public function __set($name, $value) {
    echo "Setting '$name' to '$value'\n";
    $this->data[$name] = $value;
  }
  public function __get($name) {
    echo "Getting '$name'\n";
    if (array_key_exists($name, $this->data)) {
      return $this->data[$name];
    }
  }
}
$obj = new PropertyTest;
$obj->a = 1;
echo $obj->a . "\n";
ruby
class PropertyTest
  # Location for overloaded data.
  attr_reader :data
  def initialize
    @data = {}
  end
  def method_missing(name, *arguments)
    value = arguments[0]
    name = name.to_s
    # if the method's name ends with '='
    if name[-1, 1] == "="
      method_name = name[0..-2]
      puts "Setting '#{method_name}' to '#{value}'"
      @data[method_name] = value
    else
      puts "Getting '#{name}'"
      @data[name]
    end
  end
end
obj = PropertyTest.new
obj.a = 1 # it's like calling "a=" method : obj.a=(1)
puts obj.a
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With