PHP面向对象编程-创新互联
1.全局变量
钢城网站建设公司成都创新互联公司,钢城网站设计制作,有大型网站制作公司丰富经验。已为钢城上千余家提供企业网站建设服务。企业网站搭建\外贸营销网站建设要多少钱,请找那个售后服务好的钢城做网站的公司定做!classMyClass{
static$myStaticVariable=0;
functionmyMethod(){
print self::$myStaticVariable;
}
}
$obj=newMyClass();
$obj->myMethod();
?>
2.全局变量改变
classMyClass{
static$myStaticVariable=0;
public$uniqueId;
function__construct(){
self::$myStaticVariable++;
$this->uniqueId=self::$myStaticVariable;
}
}
$obj1=newMyClass();
print$obj1->uniqueId." ";
$obj2=newMyClass();
print$obj2->uniqueId;
?>
3.静态方法
classMyClass{
static functionprintHelloWorld(){
print"hello world ";
self::printMe();
}
static functionprintMe(){
print" zhuchengdie";
}
}
MyClass::printHelloWorld();
?>
4.继承
classMyClass{
static functionprintHelloWorld(){
print"hello world ";
self::printMe();
}
static functionprintMe(){
print" tony";
}
}
classChild extendsMyClass{
function__construct(){
parent::printHelloWorld();
}
}
$child=newChild();
?>
5.枚举
classMyClass{
constRED="Red";
constGREEN="Green";
constBLUE="Blue";
functionprintBlue(){
print self::BLUE;
}
}
printMyClass::GREEN;
$obj=newMyClass();
$obj->printBlue();
?>
6.对象的引用
classMyClass{
public$var=1;
}
$obj1=newMyClass();
$obj2=$obj1;
$obj2->var=2;
print$obj1->var;
?>
打印2
7.克隆
classMyClass{
public$var=1;
}
$obj1=newMyClass();
$obj2=clone$obj1;
$obj2->var=2;
print$obj1->var;
?>
打印1
8.多态
classCat{
functionmiao(){
print"miao";
}
}
classDog{
functionwangwang(){
print"wangwang";
}
}
functionprintRightSound($obj){
if($obj instanceofCat){
$obj->miao();
}else if($obj instanceofDog){
$obj->wangwang();
}else{
print"Error comes";
}
print"
";
}
printRightSound(newCat());
printRightSound(newDog());
?>
9.多态与继承
class
Animal{
functionmakeSound(){
print"I' m other's father";
}
}
class
Cat extendsAnimal{
functionmakeSound(){
print"miao";
}
}
class
Dog extendsAnimal{
functionmakeSound(){
print"wangwang";
}
}
function
printRightSound($obj){
if($obj instanceofAnimal){
$obj->makeSound();
}else{
print"Error comes";
}
print"
";
}
printRightSound(newCat());
printRightSound(newDog());
?>
10.parent::和self::
class
.Ancestor{
constNAME="Ancestor";
function__construct(){
print"In ".self::NAME." constructor
";
}
}
class
Child extendsAncestor{
constNAME="Child";
function__construct(){
parent::__construct();
print"In ".self::NAME." constructor";
}
}
$obj=newChild();
?>
11.抽象
abstract class
MyClass{
abstract functiondraw();
}
class
Square extendsMyClass{
functiondraw(){
}
}
class
Circle extendsMyClass{
functiondraw(){
}
}
?>
12.接口
interface
MyClass{
functiondraw();
}
class
Square implementsMyClass{
functiondraw(){
}
}
class
Circle implementsMyClass{
functiondraw(){
}
}
但是接口是允许多重继承的:
interface
No1 extendsNo2,No3,…{}
与类实现接口类似,一个接口只能继承与自己互相不冲突的接口(也就是说,如果No2定义了No1已经定义的方法或者常量,我们将会收到报错信息)。
?>
13.toString()方法
class
MyClass{
function__construct($name){
$this->name=$name;
}
private$name;
function__toString(){
return$this->name;
}
}
$obj=newMyClass("tony");
$obj;
?>
14.异常处理
class
NullHandleException extendsException{
function__construct($message){
parent::__construct($message);
}
}
function
printObject($obj){
if($obj==null){
throw newNullHandleException("printObject received Null object");
}
Print$obj."
";
}
class
MyName{
private$name;
function__construct($name){
$this->name=$name;
}
function__toString(){
return$this->name;
}
}
try
{
printObject(newMyName("bill"));
printObject(null);
printObject(newMyName("Jane"));
} catch(NullHandleException $e) {
print$e->getMessage();
print" in file ".$e->getFile()."
";
print" on line ".$e->getLine()."
";
}
?>
15.在一个PHP文件里引入另一个PHP文件
MyClass.php
class MyClass{
function printHelloWorld(){
print “Hello world!”;
}
}
?>
general.php
function _autoload($class_name){
require_once($_SERVER[“DOCUMENT_ROOT”].”/classes/$class_name.php”)
}
?>
main.php
require_once “general.php”;
$obj = new MyClass();
$obj->printHelloWorld();
?>
16.在函数参数中提示类的类别
class
ABC{
}
class
EFG{
}
function
onlyWantObject1($obj){
if(!($obj instanceofABC)){
die("only Objects of type ABC can be sent to this function");
}
}
function
onlyWantObject2(ABC $obj){
}
onlyWantObject1(newEFG());
onlyWantObject2(newEFG());
?>
17.get,set方法
class
SetGetClass{
private$arr=array('x'=>null,'y'=>null);
function__get($property){
if(array_key_exists($property, $this->arr)){
return$this->arr[$property];
}else{
print"not exist!";
}
}
function__set($property,$value){
if(array_key_exists($property, $this->arr)){
$this->arr[$property]=$value;
}
}
}
$obj=newSetGetClass();
$obj->__set("x", "xxx");
$obj->__get("x");
?>
18.
call()具有很多用途。下面的例子显示如何创建一个授权模型,通过该模型一个HelloWorldDelegator类的实例可以授权所有的方法去调用一个HelloWorld类的实例call_user_func_array()函数允许_call()把它的参数通过call_user_func_array()调用传递给world::display(),后者打印3次“Hello world\n”。然后_call()返回$count的值并在屏幕中打印出来。我们不但可以通过_call()方法调用到一个不同的对象(或者用我们想要的方法处理它),而且我们还可以从_call()函数返回值,就像正常的方法一样。
class
HelloWorld{
functiondisplay($count){
for($i=0;$i<$count;$i++){
print"Hello World
";
}
return$count;
}
}
class
HelloWorldDelegator{
private$obj;
function__construct(){
$this->obj=newHelloWorld();
}
function__call($method,$args){
returncall_user_func_array(array($this->obj,$method), $args);
}
}
$obj=newHelloWorldDelegator();
$obj->display(3);
?>
19.迭代
class
HelloWorld{
public$name="John";
public$sex="male";
}
$obj=newHelloWorld();
foreach
($obj as$key=>$value){
print"obj[$key]=$value
";
}
?>
结果:
obj[name]=John
obj[sex]=male
20.迭代 通过实现Iterator
PHP5可以让我们用foreach()循环在我们的代码中重载迭代行为,使得它按照我们的类的设计执行有实际意义的遍历。
注意:PHP5不仅可以让我们重载这种行为,而且它还可以让编写扩展的作者重写类似的行为,这已经让迭代器支持多种PHP扩展,例如SimpleXML和SQite。
为了在我们的类中重载迭代器,我们需要执行一些PHP预先定义 的接口。接口如下:
interface Tracersable
interface IteratorAggregate interface Iterator
Iterator getIterator() void rewind()
void next()
bool valid()
mixed key()
mixed current()
任何实现Tracersable接口的类都可以用foreach结构遍历。但是Tracersable是一个空的接口而且不能直接被执行;反之,我们可以执行Iterator或者IteratorAggregate,他们都是从Tracersable继承来的。
主要的接口是Iterator。它定义了我们需要执行的方法以便给我们的类提供foreach迭代的功能。这些方法应该是公共的,如下表:
interface Interator | |
void rewind() | 重新把迭代器指向列表开始处 |
mixed current() | 返回当前位置的值 |
mixed key() | 返回当前位置的关键字 |
void next() | 把迭代器移动到下一个关键字/值对 |
bool valid() | 返回true/false值,判断是否有更多的值 |
例子:
class
NumberSquared implementsIterator{
private$start,$end;
private$cur;
public function__construct($start,$end){
$this->start=$start;
$this->end=$end;
}
public functionrewind(){
$this->cur=$this->start;
}
public functionkey(){
return$this->cur;
}
public functioncurrent(){
returnpow($this->cur, 2);
}
public functionnext(){
$this->cur++;
}
public functionvalid(){
return$this->cur<=$this->end;
}
}
$obj=newNumberSquared(3, 7);
foreach
($obj as$key=>$value){
print"The square of$key is$value
";
}
?>
结果:
The square of 3 is 9
The square of 4 is 16
The square of 5 is 25
The square of 6 is 36
The square of 7 is 49
21.这个代码的输出和先前的例子输出是一样的。我们可以清楚的看到IteratorAggregate接口可以让我们把我们的类的主要功能与迭代遍历它所需要的方法分离到两个独立的实体中
class
NumberSquared implementsIteratorAggregate{
private$start,$end;
public function__construct($start,$end){
$this->start=$start;
$this->end=$end;
}
public functiongetIterator(){
return newNumberSquaredIterator($this);
}
public functiongetStart(){
return$this->start;
}
public functiongetEnd(){
return$this->end;
}
}
class
NumberSquaredIterator implementsIterator{
private$obj;
private$cur;
public function__construct($obj){
$this->obj=$obj;
}
public functionrewind(){
$this->cur=$this->obj->getStart();
}
public functionkey(){
return$this->cur;
}
public functioncurrent(){
returnpow($this->cur, 2);
}
public functionnext(){
$this->cur++;
}
public functionvalid(){
return$this->cur<=$this->obj->getEnd();
}
}
$obj=newNumberSquared(3, 7);
foreach
($obj as$key=>$value){
print"The square of$key is$value
";
}
?>
22.单例模式
在这个例子中,构造函数和克隆方法都被定义为private。这么做的原因是为了防止开发者用new或者clone运算符错误的创建第二个Logger类的实例;因此,getInstance()是唯一可以访问单件类实例的方法。
class
Logger{
private function__construct(){}
private function__clone(){}
static private$instance=null;
functionLog($str){}
static functiongetInstance(){
if(self::$instance==null){
self::$instance=newLogger();
}
return self::$instance;
}
}
Logger::getInstance()->Log("check");
?>
23.工厂模式
abstract class
User{
protected$name=null;
function__construct($name){
$this->name=$name;
}
functiongetName(){
return$this->name;
}
functionhasReadPermission(){
return true;
}
functionhasModifyPermission(){
return false;
}
functionhasDeletePermission(){
return false;
}
functionwantsFlashInterface(){
return true;
}
}
class
GuestUvser extendsUser{
}
class
CustomerUser extendsUser{
functionhasModifyPermission(){
return true;
}
}
class
AdminUser extendsUser{
functionhasModifyPermission(){
return true;
}
functionhasDeletePermission(){
return true;
}
functionwantsFlashInterface(){
return false;
}
}
class
UserFactory{
private static$user=array("Andi"=>"admin","stig"=>"guest","Derick"=>"custormer");
static functionCreate($name){
if(!isset(self::$user[$name])){
print"用户不存在";
return;
}
switch(self::$user[$name]){
case"guest":
return newGuestUvser($name);
break;
case"customer":
return newCustomerUser($name);
break;
case"admin":
return newAdminUser($name);
break;
}
}
}
function
boolToStr($b){
if($b==true){
return"Yes
";
}else{
return"No
";
}
}
function
displayPermissions(User $obj){
print$obj->getName()."'s permissions:
";
print"Read:".boolToStr($obj->hasReadPermission());
print"
";
print"Modify:".boolToStr($obj->hasModifyPermission());
print"
";
print"Delete:".boolToStr($obj->hasDeletePermission());
}
function
displayRequirements(User $obj){
if($obj->wantsFlashInterface()){
print$obj->getName()." requires Flash
";
}
}
$logins=array("Andi","stig","Derick");
foreach
($logins as$log){
displayPermissions(UserFactory::Create($log));
displayRequirements(UserFactory::Create($log));
}
?>
24.读文件
$filename=fopen("test.php", "r");
do
{
$mychar=fgets($filename,1024);
echo
$mychar;
}while(!feof($filename));
fclose($filename);
?>
25.写文件
$filename="ddd.txt";
$wr1="我先被写入的";
$wr2="我后被写入的哦";
if
(is_writable($filename)){
if(!$hand=fopen($filename, "w")){
print"不能打开文件";
exit;
}
if(!fwrite($hand , $wr1)){
print"不能写入文件";
exit;
}
print"写入成功";
fclose($hand);
$hand=fopen($filename, "w");
fwrite($hand, $wr2);
fclose($hand);
print"第二次成功!";
}
?>
后面写的内容会覆盖前面的
26.写文件(以写入方式打开)会追加添加
$filename="ddd.txt";
$wr1="我先\t被写入的\r\n";
$wr2="我后被写入的哦";
if
(is_writable($filename)){
if(!$hand=fopen($filename, "a")){
print"不能打开文件";
exit;
}
if(!fwrite($hand , $wr1)){
print"不能写入文件";
exit;
}
print"写入成功";
fclose($hand);
$hand=fopen($filename, "a");
fwrite($hand, $wr2);
fclose($hand);
print"第二次成功!";
}
?>
27.指针
$filename="ddd.txt";
$handle=fopen($filename, "r");
//读取第一行
$buffer=fgets($handle,1024);
echo
$buffer."
";
//读取第二行
$buffer=fgets($handle,1024);
echo
$buffer."
";
//读取第三行
$buffer=fgets($handle,1024);
echo
$buffer."
";
//将指针回到文件开始,继续读取第一行数据
rewind($handle);
$buffer=fgets($handle,1024);
echo
$buffer."
";
fclose($handle);
?>
28.读取文件里的文件名及目录名
$dir="D:/Email";
if
(is_dir($dir)){
$dp=opendir($dir);
print_r("目录已被打开
");
while($filen=readdir($dp)){
print_r($filen."
");
}
closedir($dp);
}else{
echo"目录不存在";
}
?>
29.循环读取目录
<
table border="1">
function
direct($dir){
$dp=opendir($dir);
while($filen=readdir($dp)){
if($filen!='.'&& $filen!='..'){
$path=$dir."/".$filen;
if(is_dir($path)){
echo"目录:".$path;
echo"
";
direct($path);
}else{
echo"
echo"
echo"
}
}
}
}
$dir="D:/TestFolder";
direct(realpath($dir));
?>
30.创建目录
$dirname="pic";
$str=mkdir($dirname,100);
if
($str){
echo"创建成功";
}
?>
31.格式化当前时间
echo
date('Y m d H:i:s',time());32.正则表达式
$result=preg_match("/love/", "Oh my love");//判断字符串是否包含love
$result=ereg("^Oh", "Oh my love");//判断字符串首位是不是Oh
$result=ereg("ve$", "Oh my love");//判断字符串最后是否是ve
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
网页题目:PHP面向对象编程-创新互联
文章转载:http://cdiso.cn/article/dseech.html