Есть ли другой объектно-ориентированный язык, где есть концепция, эквивалентная Php? __invoke
метод, который позволяет объекту быть обработанным как функция / вызываемое?
Вы хотите языки, которые позволяют перегрузка оператора, так как это то, что PHP __invoke
разработан, чтобы быть похожим на.
Например, в C ++ вы можете сделать следующее:
#include <iostream>
class Test
{
public:
Test() : m_i(42) {}
friend std::ostream& operator<<(std::ostream& os, const Test& t)
{
os << t.m_i;
return os;
}
operator int()
{
return this->m_i;
}
void operator()()
{
std::cout << *this << std::endl;
}
private:
int m_i;
};
int main(int argc, char* argv[])
{
Test t;
// calls the operator<< overload to print "t"std::cout << "t = " << t << std::endl;
// calls the void operator()() to treat "t" as a function
t();
// calls the operator int() to treat "t" as an int type
int i = t;
std::cout << "i = " << i << std::endl;
return 0;
}
А в C # вы можете сделать что-то вроде следующего:
class Test
{
private int m_i = 42;
public delegate void MyDelegate(params int[] parms);
public static implicit operator int(Test t)
{
return t.m_i;
}
public static implicit operator MyDelegate(Test t)
{
return t.Invoke;
}
private void Invoke(params int[] parms)
{
foreach (int i in parms) {
this.m_i += i;
}
Console.WriteLine("i = {0}", this.m_i);
}
public override string ToString()
{
return this.m_i.ToString();
}
}
static void Main(string[] args)
{
Test t = new Test();
// calls t.ToString()
Console.WriteLine("t = {0}", t);
int d = t; // implicit cast to int
Delegate g = t; // implicit cast to Delegate type
Console.WriteLine("d = {0}", d);
// invoke the method pointed to by the delegate
g.DynamicInvoke(new int[] { 10, 20, 30 });
d = t; // implicit cast
Console.WriteLine("d = {0}", d);
}
Для этого, хотя перегрузка оператора может быть удобной, как и с любой другой функциональностью языка, вы можете подумать о Зачем вы перегружаете оператора, и если может не хватить другой более удобной для восприятия формы ООП, которая также может охватывать несколько языков.
Например, во всех этих примерах и в PHP вы могли бы написать простую перегрузку функции, которая делает то, что вам нужно, и была бы легко читаемой на нескольких языках:
class Test {
$m_i;
function Invoke() { return $m_i; }
function Invoke($x) { return $m_i + $x; }
}
class Test {
private: int m_i;
public:
int Invoke() { return this->m_i; }
int Invoke(int x) { return this->m_i + x; }
};
class Test {
private int m_i;
public int Invoke() { return this.m_i; }
public int Invoke(int x) { return this.m_i + x; }
}
Надеюсь, что это может помочь.
Других решений пока нет …