繁体   English   中英

在PHP中引用容器对象的方法?

Reference a method of container object in PHP?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

在PHP中给出以下内容:

<?php
class foo {
  public $bar;
  function __construct() {
    "Foo Exists!";
  }

  function magic_bullet($id) {
    switch($id) {
    case 1:
      echo "There is no spoon! ";
    case 2:
      echo "Or is there... ";
      break;
    }
  }
}

class bar {
  function __construct() {
    echo "Bar exists";
  }
  function target($id) {
    echo "I want a magic bullet for this ID!";
  }
}

$test = new foo();
$test->bar = new bar();
$test->bar->target(42);

我想知道'bar'类是否可以调用'foo'类的'magic bullet'方法。 'bar'实例包含在'foo'实例中,但与它没有父/子关系。 实际上,我有很多不同的“条形”类,“foo”在一个数组中,每个类都有一些与$ id不同的东西,然后想要将它传递给“magic_bullet”函数以获得最终结果,所以禁止结构更改类关系,是否可以访问“容器”实例的方法?

5 个回复

不,这是不可能的,因为没有定义任何关系。

我建议你不要直接设置$test->bar属性,而是使用setter,你可以用这种方式建立关系。 您还需要向bar类添加container属性。 里面的类foo

function setBar(bar $bar)
{
    $bar->container = $this;
    $this->bar = $bar;
}

这就建立了对象之间的关系。 现在将bar::target($id)函数更改为:

function target($id)
{
    $this->container->magic_bullet($id);
}

你现在应该可以这样做:

$test = new foo();
$bar = new bar();
$test->setBar($bar);
$test->bar->target(42);

您必须修改代码才能提供关系。 在OOP中,我们称之为聚合

假设PHP 4,以及“一系列条形图”的想法

<?php

class foo {
  var $bars = array();
  function __construct() {
    "Foo Exists!";
  }

  function magic_bullet($id) {
    switch($id) {
    case 1:
      echo "There is no spoon! ";
    case 2:
      echo "Or is there... ";
      break;
    }
  }

  function addBar( &$bar )
  {
    $bar->setFoo( $this );
    $this->bars[] = &$bar;
  }
}

class bar {
  var $foo;
  function __construct() {
    echo "Bar exists";
  }

  function target($id){
    if ( isset( $this->foo ) )
    {
      echo $this->foo->magic_bullet( $id );
    } else {
      trigger_error( 'There is no foo!', E_USER_ERROR );
    }
  }
  function setFoo( &$foo )
  {
    $this->foo = &$foo;
  }
}

$test = new foo();
$bar1 = new bar();
$bar2 = new bar();

$test->addBar( $bar1 );
$test->addBar( $bar2 );

$bar1->target( 1 );
$bar1->target( 2 );

这看起来对我来说(虽然只基于你展示的代码!)是一个静态方法的完美案例...

<?php
class foo {
  var $bar;
  function __construct() {
    "Foo Exists!";
  }

  static function magic_bullet($id) {
    switch($id) {
    case 1:
      echo "There is no spoon! ";
    case 2:
      echo "Or is there... ";
      break;
    }
  }
}

class bar {
  function __construct() {
    echo "Bar exists";
  }
  function target($id) {
    echo Foo::magic_bullet($id)
  }
}

$test = new foo();
$test->bar = new bar();
$test->bar->target(42);

或者,如果只有一个“Foo”对象 - 也许是Singleton Design模式?

你在Foo内部的$bar实例无法知道包含它的类是什么; 所以,没办法调用那个方法。

(好吧,也许(可能不是)和Reflection一起工作......我应该试试,有一天^^)

编辑:思考一下:你可以在你的酒吧类中保留指向foo的指针; 有点像这样:

class foo {
  var $bar;
  function __construct() {
    var_dump("Foo Exists!");
  }

  function magic_bullet($id) {
      var_dump('magic_bullet : ' . $id);
    switch($id) {
    case 1:
      var_dump("There is no spoon! ");
    case 2:
      var_dump("Or is there... ");
      break;
    }
  }
}

class bar {
  protected $pointer_to_foo;
  function __construct($pointer_to_foo) {
    var_dump("Bar exists");
    $this->pointer_to_foo = $pointer_to_foo;
  }
  function target($id) {
    var_dump("I want a magic bullet for this ID!");
    if (method_exists($this->pointer_to_foo, 'magic_bullet')) {
        $this->pointer_to_foo->magic_bullet($id);
    }
  }
}

$test = new foo();
$test->bar = new bar($test);
$test->bar->target(42);

注意我使用method_exists作为安全措施。

你会得到:

string 'Foo Exists!' (length=11)

string 'Bar exists' (length=10)

string 'I want a magic bullet for this ID!' (length=34)

string 'magic_bullet : 42' (length=17)

所以,它可以做...如果你稍微修改你的代码;-)


编辑2:浩, zombat击败我,它似乎:-(

你有两个选择。 我建议不要走全球路线。

$test->bar = new bar($test);

如果然后将$ test存储在bar的构造函数中,这将有效。 你也可以:

class test {
...
  public function target($someInt) {
    $this->bar->target($someInt,$this);
  }
}
$test->target(42);

...并在bar的target()方法中使用给定的测试对象。

1 动态引用PHP中的对象和方法组合

我知道如果我在PHP中有一个名为“foo”的函数,我可以通过以下方式动态调用它: 如果foo是一个名为“bar”的对象的方法,我可以动态调用它,如下所示: 这里唯一的问题---我需要dymaically不仅指定对象的方法-但我需要动态指定对象本身以及---并通过组合关到利用字符串 ...

2 applescript如何引用容器中的对象

我想使用Terminal和osascript命令在OS X上将当前系统音频音量降低10%。 我正在这样做: osascript -e 'get volume settings' 哪些打印: output volume:38, input volume:100, alert ...

4 在方法中引用对象

如何在下面的方法中引用在第一个按钮中创建的学生对象? 我以为我可以简单地“引用对象学生”,但是当我这样做时,我不会让我使用与学生类相关的任何方法,而只是说“对象不包含……的定义”。 按钮: 方法: ...

2013-11-17 04:29:29 2 44   c#
6 VBA引用容器对象 - 语法和面向对象的方法

对于我来说,这是一个关于学习面向对象方法的问题,因为它与VBA语法有关。 假设我创建了几个类,如Car,Truck,Bus等。我创建了另一个类SpeedCalculator,我的车辆实例将实例化并包含。 (作为一个新手,让我注意到这是一个很好的时间来宣布一个类是静态的,而不是实例化它 - 哪 ...

7 在事件函数中引用容器对象

我有这样的代码 我想知道如何在不对MyObj进行硬编码的情况下(即此)来引用MyObj,因此我可以在不更改代码的情况下更改对象名称。 我只对垃圾对象表示法感兴趣。 编辑 : 我做错了。 其中一个功能实际上是onmousedown事件,因此该功能无法正常工作...这将引 ...

8 如何在php中引用其他对象?

我对Php很陌生,来自Java。 我有这样的Java类: 在同一包中。 在类A内部,我定义了类型B的数据类型,例如: 我想要在php中相同的行为。 有可能这样做吗? 并且有什么办法可以在php中“打包”我的课程? 提前致谢。 ...

2013-01-15 09:43:59 3 48   java/ php
9 引用对象PHP中的计数

我正在尝试从下面的对象引用COUNT(*) 。 我按照以下示例使用$the_date = $obj2-&gt;the_date来获取日期,但是如何引用count呢? 当然使用COUNT(*)会引发错误。 ...

10 PHP 5中的对象和引用

我在php.net手册的以下几行中找到了我无法理解的确切内容。 “从PHP 5开始,对象变量不再包含对象本身的值。它仅包含一个对象标识符,该对象标识符允许对象访问者找到实际的对象。当对象通过参数发送,返回或分配给另一个变量时,不同的变量不是别名:它们持有标识符的副本,该副本指向同一对象 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM