【问题标题】:Possible to create a class that has a default value [duplicate]可以创建一个具有默认值的类[重复]
【发布时间】:2013-05-15 23:39:37
【问题描述】:

我想知道是否有一种方法可以在 PHP 中创建一个与其他变量相比使用默认值而不是类本身的类?这样:

class Test {
    private $name;
    private $val;
    public function __construct($name, $val) {
       $this->name = $name;
       $this->val = $val;
    }
    public __default() {
        return $val;
    }
    public function getName() {
        return $name;
    }
}

然后当我将它与另一个值进行比较时,我可以使用像 __default 这样的函数:

$t = new Test("Joe", 12345);
if($t == 12345) { echo "I want this to work"; }

将打印“我希望它工作”这句话。

【问题讨论】:

  • 我不能使用 PECL 但谢谢

标签: php


【解决方案1】:

据我所知,这是不可能的。您正在寻找的最接近的是要在类上设置的 __toString() 方法。

http://php.net/manual/en/language.oop5.magic.php

PHP 可能会尝试将其转换为整数,但我不确定是否有类方法可以完成此操作。你可以试试字符串比较。

<?php
class Test {
    private $name;
    private $val;
    public function __construct($name, $val) {
       $this->name = $name;
       $this->val = $val;
    }
    public function __toString() {
        return (string)$this->val;
    }

    public function __toInt() {
        return $this->val;
    }

    public function getName() {
        return $this->name;
    }
}

$t = new Test("Joe", 12345);
if($t == '12345') { echo "I want this to work"; }

【讨论】:

  • 不幸的是 _toInt 不是真正的魔法方法。我把它放在那里进行测试。
  • 就我而言应该是。
  • 看起来是功能请求,但被拒绝了bugs.php.net/bug.php?id=48076
【解决方案2】:

__toString 魔术方法会做你想做的事,但有一些注意事项:

class Test {
    private $name;
    private $val;
    public function __construct($name, $val) {
       $this->name = $name;
       $this->val = $val;
    }
    public function __toString() {
        return $this->val;
    }
    public function getName() {
        return $this->name;
    }
}

对象不能直接转换为整数,因此在与整数比较时总是会得到 a,但如果将比较的任一侧转换为字符串,它将按预期工作。

if($t == 12345)          // false with a warning about can't cast object to integer
if((string)$t  == 12345) // true
if($t == "12345")        // true 

【讨论】:

    【解决方案3】:

    在你的课堂上实现__toString()

    喜欢:

    class myClass {
        // your stuff
    
        public function __toString() {
            return "something, or a member property....";
        }
    }
    

    【讨论】:

    • 我试过 __toString 但没有运气,但后来又试了几次,这一次确实在比较后工作了几次,谢谢!
    【解决方案4】:

    您的对象不太可能等于整数。但是你可以实现类似于 Java 的 hashCode() 的东西——一个类方法,它做一些数学运算来产生数字哈希——一个基于即它的内部状态、变量等的返回值。然后比较这些哈希码。

    【讨论】:

      【解决方案5】:

      为什么不沿着这条线:

      class Test {
          private $name;
          private $val;
          public function __construct($name, $val) {
             $this->name = $name;
             $this->val = $val;
          }
          public __default() {
              return $val;
          }
      
          public compare($input) {
              if($this->val == $input)
                  return TRUE;
              return FALSE;
          } 
      
          public function getName() {
              return $name;
          }
      }
      
      $t = new Test("Joe", 12345);
      if($t->compare(12345)) { echo "I want this to work"; }
      

      从其他答案看来,没有内置函数可以处理这个问题。

      【讨论】:

      • 因为我希望它是无缝的,将使用的属性仍然是值,但我可以追溯它们来自什么类和属性。
      猜你喜欢
      • 2015-10-28
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      • 2012-05-08
      • 2019-03-22
      • 2016-05-12
      • 1970-01-01
      相关资源
      最近更新 更多