草庐IT

php - 从数组访问类变量

coder 2024-04-17 原文

我是 PHP 新手,在访问某些类变量时遇到问题。

我有这门课:

class emptyClass 
{
  private $ladderWinsNoCoin   = 0;    
  private $ladderWinsCoin   = 0;  
  private $arenaWinsNoCoin   = 0;     
  private $arenaWinsCoin   = 0;       
  private $ladderLossesNoCoin = 0;    
  private $ladderLossesCoin = 0;  
  private $arenaLossesNoCoin = 0;     
  private $arenaLossesCoin = 0;   

  public function getProperty($property) {
        if (property_exists($this, $property)) {
              return $this->$property;
            }
          }

    public function upOne($property) {
        if (property_exists($this, $property)) {
              $this->$property=($property+1);
            }
          }

    public function setProperty($property, $value) {
        if (property_exists($this, $property)) {
          $this->$property = $value;
        }
    }
}

然后我在一个数组中创建它的 9 个实例

/* Create classes in an array so we can call 
them with strings from the database*/
$classes = array(  
  'Druid'  => new emptyClass, 
  'Hunter' => new emptyClass, 
  'Mage'   => new emptyClass,
  'Paladin'=> new emptyClass, 
  'Priest' => new emptyClass, 
  'Rogue'  => new emptyClass,
  'Shaman' => new emptyClass, 
  'Warlock'=> new emptyClass, 
  'Warrior'=> new emptyClass
);  

接下来我想增加类变量的值以匹配从数据库中获取的数据,这就是我想出的

foreach ($games as $game){               // Go through the games array from the database 
              $gameID = current($game);      // Unused (for now)
           $heroClass = (string)next($game); 
        $villainClass = (string)next($game); // Unused (for now)
                 $win = (int)next($game);
                $coin = (int)next($game);
              $ladder = (int)next($game);

                         //Add up the values in the class objects
               if ($ladder==1&&$coin==1&&$win==1){          // Ladder win with coin
        $classes[$heroClass] -> {upOne($ladderWinsCoin)};
    } else if ($ladder==1&&$coin==1&&$win==0){  // Ladder loss with coin
        $classes[$heroClass] -> {upOne($ladderLossesCoin)}; 
    } else if ($ladder==1&&$coin==0&&$win==1){  // Ladder win without coin
        $classes[$heroClass] -> {upOne($ladderWinsNoCoin)};
    } else if ($ladder==1&&$coin==0&&$win==0){  // Ladder loss without coin
        $classes[$heroClass] -> {upOne($ladderLossesNoCoin)};
    } else if ($ladder==0&&$coin==1&&$win==1){  // Arena win with coin
        $classes[$heroClass] -> {upOne($arenaLossesCoin)};
    } else if ($ladder==0&&$coin==1&&$win==0){  // Arena loss with coin
        $classes[$heroClass] -> {upOne($arenaLossesCoin)}; 
    } else if ($ladder==0&&$coin==0&&$win==1){  // Arena win without coin
        $classes[$heroClass] -> {upOne($arenaWinsNoCoin)};
    } else if ($ladder==0&&$coin==0&&$win==0){  // Arena loss without coin
        $classes[$heroClass] -> {upOne($arenaLossesNoCoin)};
    }

$game 是数据库中的一个数组,看起来像这样

[1, '法师', '德鲁伊', 1, 0, 1]

当它运行时我得到一个 fatal error

PHP fatal error :调用/home/vooders/public_html/gameReader.php 中的未定义函数 setProperty() 第 48 行


编辑:

所以在尝试重命名 getter/setter 之后我仍然遇到 fatal error ,所以现在我确定它是如何调用对象的。

我会试着告诉你我的想法

$classes[$heroClass] -> {upOne($ladderWinsCoin)};

如果我们采用上面的这一行,$heroClass 将是本例中数据库中的一个字符串 'Mage'

现在我想使用这个字符串从 $classes 数组中调用正确的对象,然后将适当的变量递增 1。

最佳答案

明确地说,我会建议您不要“在了解类业务的类外部编写代码。”

“我是一个类。因此,我还活着。告诉我发生了什么,我会做出相应的回应。问我你想知道什么我会为你提供答案。但是:不要插手类事务,因为你很脆,加上伍斯特沙司味道很好!!”

(1) 不要“从外部”对类的变量施加粘手。 告诉类发生了什么,它可能会增加或减少自己的属性。 (你确实说它们是私有(private)的,不是吗?他们应该是。)

(2) 如果您想知道“答案”,它可能基于一个或多个属性的值,根据简单或复杂的逻辑,那么应该包含该逻辑,因为它属于“自身”。

关于php - 从数组访问类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31212439/

有关php - 从数组访问类变量的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  3. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

  4. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  5. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  6. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  7. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  8. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  9. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  10. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

随机推荐