Php 是否有一个与uu toString()等价的整数
有没有办法告诉PHP如何将对象转换为int?理想情况下,它看起来像Php 是否有一个与uu toString()等价的整数,php,Php,有没有办法告诉PHP如何将对象转换为int?理想情况下,它看起来像 class ExampleClass { ... public function __toString() { return $this->getName(); } public function __toInt() { return $this->getId(); } } 我意识到这种形式不支持它,但有没有一种简单(不太粗
class ExampleClass
{
...
public function __toString()
{
return $this->getName();
}
public function __toInt()
{
return $this->getId();
}
}
我意识到这种形式不支持它,但有没有一种简单(不太粗糙)的解决方法
----------------------编辑编辑编辑-----------------------------
谢谢大家!我研究这个的主要原因是我想让一些类(表单生成器、菜单类等)使用对象而不是数组(uniqueId=>description)。如果您决定它们应该只处理那些对象,或者只处理扩展某种通用对象超类的对象,那么这就足够简单了
但我想看看是否有中间道路:理想情况下,我的框架类可以接受整数字符串对,或者使用getId()和getDescription()方法的对象。因为在我想使用stackoverflow的综合知识来找出是否有一种标准/最佳实践方法可以做到这一点,而不会与php标准库、通用框架等发生冲突之前,其他人肯定已经想到了这一点
\uu toInt()
没有。恐怕没有这样的事情。我不确定你为什么需要这个,但是考虑下面的选项:
添加toInt()
方法,在类中强制转换。你可能已经意识到了这一点
public function toInt()
{
return (int) $this->__toString();
}
在类外重复施法,将导致int
$int = (int) (string) $class;
在类外创建一个特殊函数:
function intify($class)
{
return (int) (string) $class;
}
$int = intify($class);
当然,
\uu toString()
方法可以返回一个包含数字的字符串:返回“123”
。类之外的用法可能会自动将此字符串转换为整数。使对象实现ArrayAccess和迭代器
class myObj implements ArrayAccess, Iterator
{
}
$thing = new myObj();
$thing[$id] = $name;
然后,在使用此数据的代码中,可以使用与以前相同的“旧式”数组代码:
// Here, $thing can be either an array or an instance of myObj
function doSomething($thing) {
foreach ($thing as $id => $name) {
// ....
}
}
您可以使用重新键入:
class Num
{
private $num;
public function __construct($num)
{
$this->num = $num;
}
public function __toString()
{
return (string) $this->num;
}
}
$n1 = new Num(5);
$n2 = new Num(10);
$n3 = (int) (string) $n1 + (int) (string) $n2; // 15
我认为你误解了这个问题;)是否有一个整数等价于
\uuu toString()
@Felix,我确实读错了,在你回答之前几秒钟我编辑了我的答案:)谢谢。谢谢你的时间!我知道uuu-toInt()不存在,这就是我要求解决问题的原因。这似乎是几乎正确的答案,也许它应该说“既不是uu-toInt()
也不是u-toInt()
,或者任何类似的东西都不存在”。我认为这对非OP受众/观众来说是一个更好的答案。我不确定PHP如何知道区别__toString()用于直接输出对象,而不仅仅是类型转换。您可以像在Java中一样创建一个“object”类,并从中派生所有内容,然后实现一个可重写的方法。@Phil幸运的是,我使用的是5.3,所以我不再有这个问题:)一种可能的情况是将对象与int:if($myPseudoInt>1)进行比较-这导致一个通知a la:“类PseudoInt的对象无法转换为int”。如果使用一个u_toInt()-方法来允许在没有显式铸件的情况下进行这样的比较,那会很好。我们仍在等待,但也许有一天:谢谢!我之所以要研究这个问题,是因为我想让一些类(表单生成器、菜单类等)使用对象而不是数组(uniqueId=>description),但不具体地使它们适应这些对象(失去通用性),也不引入一个总体对象类(失去通用性+需要调整的大量代码)。我希望能找到某种中介解决方案。这就是接口的用途,对吗?spl\u object\u hash()为每个对象返回一个唯一的id。好问题,亲爱的!但是这些ID会随着请求的不同而变化,没有?spl\u object\u hash()
会在每个新请求中返回一个随机的hash。哦,好吧。谢谢你帮助大家!