4

我无法理解如何使用对象。

具体代码:

class first{
    class second{
        public function widgets(){
            $a_variable = $a_value;
        }
        #1
    }
    $second = new second;
    #2
}
#3
$first = new first;
  1. 如果我初始化$a_variable,因为$a_variable它仅在函数内部可用,对吗?
  2. 如果我初始化$a_varialbe,因为$this->a_variable它仅在第二类中可用,对吗?
  3. 我可以初始化$a_variable$first->second->a_variable吗?如果是这样,我将如何在#1#2和处调用它#3
  4. 我可以初始化$a_varialbe as $this->second->a_variable吗?如果是这样,我将如何在#1#2和处调用它#3

如您所见,我对 OOP 的工作方式感到困惑。


首先,我想表达我对所有帮助的感激之情。我已经学到了足够多的东西来认为这个问题取得了巨大的成功。

也就是说,即使它的公式很差,伪代码和语法无效,这个代码也可以运行。

class class_1{

    public function function_1(){

        require('class_2.php');

        public function function_2_callback(){

            //%%%%%%  How do I set a variable here and get the DATA...

        }

        $this->class_2 = new class_2("function_2_callback");
    }

}

$class_1 = new class_1;

//&&&&&&&&&& Get the DATA here?



/* CONTENTS OF class_2.php */

class class_2($callback){

    call_user_function($callback);

}

即使我们必须将其视为练习。有人能告诉我如何首先设置(@%%%%%%%)然后调用变量(@&&&&&&&&),如图所示?

4

4 回答 4

2

你不应该像这样嵌套类。那甚至不应该运行。我建议先运行代码。有一些在线工具可用于测试 PHP 代码的小片段,例如.

为了使代码按您预期的方式运行,它应该如下所示:

class second{
    public function widgets(){
        $a_variable = $a_value;
    }
}

class first{
    public $second;

    public function __construct() {
        $this->second = new second;
    }
}

$first = new first;

以 $[az]+ 开头的变量是函数的局部变量。以 $this->[az]+ 开头的属性(其中 [az] 是 1 个或多个字母)是对象的一部分。

php.net 上有一些文档,其中介绍了 php 中对象的细节

如果我将 $a_variable 初始化为 $a_variable 它仅在函数内部可用,对吗?

是,对的。它以 $[az] 开头。如果您使用global关键字,则不完全正确,但不鼓励这样做。

如果我将 $a_varialbe 初始化为 $this->a_variable 它只能在第二类中使用,对吗?

是的,但你应该先声明它。您可以使用 或 来执行public $variableprotected $variable操作private $variablepublic意味着可以从外部访问属性,而private意味着只有类本身可以访问它。protected对外部是私有的,但对从你的类扩展的类是公共的。

( public//在 PHP 5 中可用。在 PHP 4 中您将使用private,在 PHP 5 中默认为 public)publicvar $variable

我可以将 $a_variable 初始化为 $first->second->a_variable 吗?

您可以在不声明它们的情况下任意初始化类变量,但这不是您应该做的事情。

如果是这样,我将如何在#1、#2 和#3 中调用它?

您不能在那里调用代码(在您的示例中)。代码必须在函数内部或全局上下文中(在类定义之外)。

于 2012-11-20T07:57:41.903 回答
2

类的简要说明

class foo{

    // This can be accessed anywhere
    public $i_am_public;

    // This can be accessed within this class and any sub classes
    protected $i_am_protected;

    // Thi can only be accessed within this class
    private $i_am_private;

    // This function can be accessed anywhere
    public function foo_function(){

        // This variable is only available in this function
        // it cannot be accessed anywhere else
        $variable = 'Hello World';

        // However, you can access any of the other variables listed above
        // like so
        $this->i_am_public = 'public';
        $this->i_am_protected = 'protected';
        $this->i_am_private = 'private';

        // Write these variables
        echo $this->i_am_public;
        echo $this->i_am_protected;
        echo $this->i_am_private;
    }
}

$foo = new foo;

$foo->foo_function();

// You can change any publicly defined variables outside
// of the class instance like so
$foo->i_am_public = 'testing';

问题的具体答案

在我继续之前,我强烈建议您不要在类中定义类!相反,使用我将在稍后解释的类扩展。事实上,我很惊讶你的代码甚至可以工作!

如果我将 $a_variable 初始化为 $a_variable 它仅在函数内部可用,对吗?

是的,这仅在函数内部可用。如果要在函数外部访问它,则需要使用范围定义之一在函数外部定义它public, protected, private

如果我将 $a_varialbe 初始化为 $this->a_variable 它只能在第二类中使用,对吗?

这取决于你给它的范围,但无论如何你都不应该在一个类中定义一个类。

我可以将 $a_variable 初始化为 $first->second->a_variable 吗?如果是这样,我将如何在#1、#2 和#3 中调用它?

我无法回答这个问题,因为我从来没有在一个类中嵌套过一个类,我再次敦促你改变这个结构。

我可以将 $a_varialbe 初始化为 $this->second->a_variable 吗?如果是这样,我将如何在#1、#2 和#3 中调用它?

请参阅上面的答案:-)

嵌套类

如前所述,我以前从未见过这个,我很惊讶它甚至可以工作。你绝对应该改变这个结构。

一个建议是使用这样的扩展:

class foo{

    // This can be accessed anywhere
    public $i_am_public;

    // This can be accessed within this class and any sub classes
    protected $i_am_protected;

    // Thi can only be accessed within this class
    private $i_am_private;

    public function foo_function(){

        echo 'Hello World';
    }
}

class bar extends foo {

    // This is a public function    
    public function baz(){

        // These will work
        $this->i_am_public = 'public';
        $this->i_am_protected = 'protected';

        // This will not work as it is only available to
        // the parent class
        $this->i_am_private = 'private';
    }
}

// This will create a new instance of bar which is an 
// extension of foo. All public variables and functions
// in both classes will work
$bar = new bar;

// This will work because it is public and it is inherited
// from the parent class
$bar->foo_function();

// This will work because it is public
$bar->baz();
于 2012-11-20T08:18:48.327 回答
2

首先,您的示例是无效代码 PHP 不支持嵌套类,即类中的类。

如果你定义一个类,在方法中初始化的变量是该方法的本地变量,而你可以使用 $this->newattribute 来“初始化”一个属性,你应该在之前声明它及其可见性(在你编写一个公共方法之前 /私有/受保护 $varname = "初始值";)。

您的问题 3 和 4 在另一个上下文中是有意义的,这是当一个对象作为另一个对象的成员传递时,请参见下面的示例。

如果你像这样构建它

<?php

class First {  
  public $second;
}

class Second {
  public $a_variable;
}

$foo = new First();
$foo->second = new Second();

你可以访问它:

$foo->second->a_variable = "foo";

或在第二个方法内

$this->a_variable;

或在第一个方法中

$this->second->a_variable;
于 2012-11-20T08:20:05.557 回答
2

首先:你所拥有的不起作用,你不能以你正在做的方式在一个类中声明一个类(尽管有条件地在一个函数中声明一个类,你不应该这样做)。

PHP 中的作用域(包括 OOP)非常简单:

  1. 变量具有函数作用域
  2. 如果您有对对象的引用,则可以访问对象属性
  3. 可以限制对象属性的可见性

您拥有的唯一真正作用域是变量的函数作用域:

$a = 'foo';

function bar() {
    $a = 'bar';
}

这两个$as完全不相关,在不同的范围内。就如此容易。

class Foo {

    public $a = 'foo';

    public function bar() {
        $this->a;  // foo

        $a = 'bar';
    }

}

$foo = new Foo;
$foo->a;  // foo

对象属性没有范围,它具有可见性。如果对象在范围内,则可以访问它。上面,$foo是对象。它在范围内,它的属性apublic,因此可以使用$foo->a. 在类内部,可以通过 访问该属性$this->a

是函数中的$a = 'bar'局部变量,与 无关$this->a。除了函数内部,它在任何地方都无法访问。请参阅规则 #1,功能范围。

class Bar {

    protected $b = 'bar';

    public function baz() {
        $this->b;  // bar
    }

}

$bar = new Bar;
$bar->b;  // doesn't work

如果可见性不是,则无法从类本身外部访问public该属性(此处b) 。在类内部,您可以使用 访问它,但不能从外部使用。这不是关于范围,而是关于可见性。$this->b$bar->b

这几乎就是 PHP 中的范围规则。

于 2012-11-20T08:22:32.953 回答