Categories: PHP | Tags: | Views: 1,191

首先希望大家不要把我当火星人 ^_^!

类外函数是不能直接调用类的成员变量和成员函数的, 以前根本没有意识到这样的问题

是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
<?php
class varhead{
var title;
function varhead(title='welcome'){
$this->title=title;
}
function setTitle(title='welcome'){
$this->title=title;
}
}
$varhead=new varhead();
//我先定义了这样一个类, 是用来设置网页的各种头部信息的.
//并且将它实例化
function isHome(){
if($varhead->title=='welcome')echo 'HomePage';
}
//这是一个类外函数, 我想调类varhead的成员变量title的值.
//但是没想到, 在函数isHome中怎么也得不到$varhead->title的值.
//我开始意识到, 在类外函数中, 可能不能直接调用类的成员变量
//我试过这样, 但仍然不行:
/*
$t=$varhead->title;
function isHome(){
if($t=='welcome')echo 'HomePage';
}
*/
?>

后来我在百度上找到一种解决办法, 就是在类外的函数中重新实例化一个类对象, 然后而进行调用.

1
2
3
4
function isHome(){
$varhead1=new varhead();
if($varhead1->title=='welcome')echo 'HomePage';
}

这样是可以的, 可以得到$varhead1->title的值.

但是新的问题又出现了, 这个实例化的对象$varhead1和我原来实例化的对象$varhead是两个不同的对象, 也就是说,如果我先设置了title.

1
$varhead->setTitle("products");

这样对函数中的对象$varhead1将不会有任何的影响, 而$varhead1->title的值还将会是默认值’welcome’, 仍然判断不出该页是否首页.

后来再想到WP的一个插件CountPosts, 由于我改过这个插件, 在里面加了留言数,评论数以及文章的点击数, 发现这个插件里面的函数可以直接使用WP实例化的数据库类$wpdb, 但它每个函数前面都将这个对象声明为了全局变量.

于是我也试试,发现这样才是解决问题的根本途径:

1
2
3
4
function isHome(){
global $varhead;
if($varhead->title=='welcome')echo 'HomePage';
}

这样问题就得到了完美的解决.

也就是说要想从类外函数调用类的成员变量和成员函数就必须在类外的函数中global一下类(PS:我不知道这个操作叫什么, 什么不是声明吧),才能调用类的成员变量和函数.

这篇文章来自 迷途知返(PWWANG.COM), 转载请注明出处。 版权说明

No comments yet.
;) :| :x :twisted: :roll: :oops: :o :mrgreen: :lol: :idea: :evil: :cry: :arrow: :P :D :?: :? :) :( :!: 8O 8)

你可以使用@somebody:开头, 来邮件通知somebody你回复了他的留言(用户名区分大小写).