如何在PHP类中分配变量?

时间:2016-07-24 23:51:20

标签: php

我在codeacademy中练习了与PHP中的对象相关的练习。它要我在班级$name中定义公共变量Cat

    <?php
        class Cat {

            public $isAlive = true;
            public $numLegs = 4;
            public $name;

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

            public function meow() {
                return "Meow meow. " . $this->name . "<br>";
            }
        }

        $cat1 = new Cat( "CodeCat" );
        echo $cat1->meow();

    ?>

实际需要这条public $name;行吗?据我了解,我使用参数值__construct调用特殊函数CodeCat。然后将此CodeCat分配给变量$this->name,这是我稍后在函数meow中使用的内容。如果我注释掉public $name;行,那么这不会影响结果。

2 个答案:

答案 0 :(得分:3)

  

这个公共$ name; 行实际需要吗? ......如果我评论出来的话    public $ name; 行,那么这不会影响结果。

PHP会根据请求在您的对象上创建属性,即使您从未正式声明它们。

Class Thing{}
$a = new Thing();
$a->name = 'John';
echo $a->name; // John
echo $a->age; // doesn't break script but PHP gives 'Notice: undefined property'

Run it here

因此,您的代码以任何一种方式运行,因为当您将name属性设置为__construct()内的某个属性时,它会添加Cat属性。由于默认情况下属性是公共的,因此会得到相同的结果。

这个代码设计(使用属性而不声明它们)是一个糟糕的习惯,原因如下:

  • 对于想要使用或与您的代码互动的其他人来说,这是一场噩梦
  • 如果您处理的不仅仅是一个非常简单的脚本,那对您来说也是一场噩梦。在大型应用程序中,我们无法知道这个 // initially detach form to be attached to each div on click var editForm = $('.edit-container').detach(); function fillForm(title, priority) { $('.venue-input').val(title); $('.priority-input').val(priority); } for(var i = array.length -1; i>=0; i--) { var prop = array[i].feature.prop if(prop.title) { // create variable to hold html var html = $([ "<div class='venue-item'>", " <span><strong>Venue Name</strong></span>", " <span class='venue-name venue-title' data-title=" + prop.title + ">" + prop.title + "</span>", "<span class='venue-priority' data-priority=" + prop.prioritylevel + "><strong>Priority</strong>" + ' ' + prop.prioritylevel + "</span></div>"].join("\n")); // append venue item to venue list div with event handler to add form and prefill when clicked $(html).appendTo('.venue-list').on('click', function() { $(this).after(editForm); fillForm($('.venue-title').data('title'), $('.venue-priority').data('priority')); }); } 实例是否有名称?这个实例怎么样?其他什么属性它还有吗?如果你在不同的功能,或者更糟的是不同的文件中动态添加属性,这些都不容易回答。
  • 调用代码无法保证属性存在,因此您的程序可能会有更多错误
  • IDE和代码编辑无法知道对象的形状,因此您被剥夺了强大的工具。您的脚本需要更长时间才能编写

答案 1 :(得分:0)

公共变量允许您直接将它们修改为字段,而不是通过公共方法。添加以下行:

    $cat1 = new Cat( "CodeCat" );
    echo $cat1->meow();

    $cat1->name = "Another Cat";
    echo $cat1->meow();

你会看到:

Meow meow. CodeCat<br>
Meow meow. Another Cat<br>

即使在施工后,您也可以更改$ name的值。

私人财产:

将$ name的访问者从public更改为private,您将收到此错误:

Fatal error: Cannot access private property Cat::$name

尝试从$ cat1对象中为其赋值。