php中既然可以直接用类名调用类中的方法和属性,那还声明对象干嘛? 这不是多此一举吗?

classOne{var$a;var$b;functionget(){echo'hello';}}$one=newOne();$one->get();echo'<br>-... class One
{
var $a;
var $b;

function get()
{
echo 'hello';
}
}

$one = new One();
$one->get();
echo '<br>-----------------<br>';
One::get();//这么一条语句可以代替$one = new One();$one->get();两条。???
展开
 我来答
小小幽魂
2011-08-06 · TA获得超过1469个赞
知道小有建树答主
回答量:751
采纳率:100%
帮助的人:677万
展开全部
你的写法是 PHP 4 格式,只是PHP在向下兼容罢了。。

类方法的静态调用问题。。你是想知道,即然可以静态调用,为什么还要实例化对象。

从使用的角度来说,区别在于。这是一个对象。还是一个类。主要是思路上的区别。从书写的角度来说,也是各有优缺点。。

正如你看到的,静态调用可以省去实例化,而且全局有效。但是用起来,更像是自定义函数。很难体现出 OOP 思想所在。

实例化之后的变量是一个对象,有明确的方法和属性。从编程思路上来说更清晰。

如果你只是以这么简单的代码来举例,感觉当然都一样。那么我举个例子。

$mysql = new db_mysql(); //实例化一个MYSQL对象
$rows = $mysql->table('test')->select(); //MYSQL 对象查询一个表数据。
$mysql->debug(); // MYSQL 打印错误信息
以上代码全是 MYSQL 对象在操作。。

如果用全静态化的方法写。就得这么写:
db_mysql::table('test'); //设置一个数据表,是谁在控制。
$rows = db_mysql::select(); //查询数据,谁在查?
db_mysq::debug(); //打印错误信息,错误信息是谁发出来的?
以上代码对象完全不清晰。只知道是 MYSQL 的一些功能。

你还觉得这么写方便么?而且代码长起来会更混乱。思路都已经有些混乱了。如果你试着封装这么一个类,你会觉得更麻烦。
追问
哦  原来是这样啊。  不过我还对这个面向对象有些疑问。就是在访问类属性(比方说$a吧)可以这样:$this->a; 还可以这样self::$a; 那么->和 :: 这两个符号功能差不多那为毛一个a不加$符号,一个a却要加$符号???????感觉越学越混乱啊。一点条理都没有啊怎么。java还好 这个php的对象整的我头都大了。哦 对了 我加你qq了 。  不懂的地方向你请教请教 谢谢啦。
lew88
2011-08-06 · TA获得超过485个赞
知道小有建树答主
回答量:245
采纳率:0%
帮助的人:140万
展开全部
不是所有的方法都可以这样的,必须是用static声明的方法才能用one::get()来调用,像你上面说的的是不能这样调用的!!
更多追问追答
追问
可以的啊  运行后输出
hello
-------------
hello

何解?
追答
不可以的,要这样才可以用的static function get(){};你试一试把one::get ,放到$one=new one();的上面去,看能不能出现这个结果。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式