我在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;
行,那么这不会影响结果。
答案 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'
因此,您的代码以任何一种方式运行,因为当您将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'));
});
}
实例是否有名称?,这个实例怎么样?,其他什么属性它还有吗?如果你在不同的功能,或者更糟的是不同的文件中动态添加属性,这些都不容易回答。答案 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对象中为其赋值。