《PHP和MySQL WEB开发》第六章笔记

这个是练习页面

<?  
/*UNIT6 面向对象的PHP*/  
/*6.1理解面向对象的概念*/  
/*6.1.1类和对象*/  
//面向功能或者面向过程的软件被看作是过时的unfortunately,大部分的web脚本仍然是属于面向功能的。  
  
//面向对象的操作语言必须支持多态性——不同的类对同一个操作有不同的行为。  
  
//类的继承  
  
//几个名词:类,对象,超类,父类,子类,派生类  
  
  
  
  
  
/*6.2在php中创建类class*/  
class luclass{  
    public $attribute1;//public创建了属性,记得加$  
    public $attribute2;  
    }  
class luclass2{  
    function operation1(){}  
    function operation2($param1,$param2){}  
    //创建了一个类包含一个方法和一个有两个参数的方法  
  
    }  
  
  
  
  
  
/*6.2.2构造函数*/  
//创造一个我不知道什么意思的构造函数的类  
  
class luclass3{  
  
    function __construct($param){  
        echo "Constructor called with parameter".$param."\.<br />";  
        }  
    }  
//不知道这个怎么用比着葫芦画瓢吧  
  
  
  
  
  
/*6.2.3析构函数*/  
class luclass4{  
    function __destruct(){//析构函数括号中不含有任何参数,不包证这个语法是正确的。  
          
        }  
    }  
  
/*6.3类的实例化*/  
class luclass5{  
    function __construct($param){  
        echo "这个类将输出输入的字符:".$param."<br />";  
        }  
    }  
new luclass5("hello,world!");   
  
//截止到现在 我仍然不明白构造函数有什么用,类和函数有什么区别。。。  
  
//好像这个地方不用构造函数不行,不用构造函数打印不出来东西。不使用函数直接在类里面用echo 会报错。  
  
  
  
  
  
/*6.4使用类的属性 $this->*/  
  
class luclass6{  
    public $attribute;  
    function operation($param){  
        $this->attribute="这个luclass6类的attribute属性是".$param;  
        echo $this->attribute;  
        }  
    }  
//截止现在仍然不知道类里面的函数怎么调用  
  
  
  
class luclass7{  
    public $ism;  
    }  
$m=new luclass7();  
$m->ism="yes";  
echo $m->ism;  
//创建了一个luclass7类,定义了一个属性ism。然后创建了一个属于luclass7的对象m,将这个对象的ism属性设置为yes  
  
//但是php不建议使用这种方法。建议使用封装  
  
class luclass8{  
  
    public $iss;  
    function __get($attribute){  
        return $this->$attribute;  
        }//返回调用的属性  
    function __set($attribute,$value){  
        $this->attribute=$value;   
        }  
    }  
//日了狗了,这段函数也没什么用,说是最初设置的时候的可能这样设置的,跟luclass7一模一样的。  
  
$s=new luclass8();  
  
$s->iss="yes";  
echo $s->iss;  
  
class luteacher{  
    public $sex;  
    public $height;  
    public $name;  
    function __set($attribute,$value){  
        if($attribute=="sex" and $value=="男"||$value=="女"){  
            $this->sex=$value;  
            }  
        if($attribute=="height" and $value<=300||$value>=40){  
            $this->height=$value;  
            }  
        }  
      
    }  
  
$lvnan=new luteacher();  
$lvnan->name="吕楠";  
$lvnan->sex="女";  
$lvnan->height="160";  
echo "这个老师就是".$lvnan->name.",性别".$lvnan->sex.",身高".$lvnan->height."厘米,学生们都很喜欢她。<br />";  
  
  
/*6.5使用private and public 访问修饰符关键字控制访问*/  
//访问修饰符:public(默认),private,和protected(介于他俩之间)  
class luclass9{  
    public $sex;  
    public function __set($name,$value){  
        if($name=="sex"){  
            $this->sex=$value;  
            }     
        }  
    public function aaaaa(){  
        echo "这是class9类里面的一个动作。";  
        }     
    }  
  
$a=new luclass9();  
$a->sex="女";  
echo $a->sex."<br />";  
$a->aaaaa();  
  
//上面这个就是类 操作的调用。  
  
  
/*6.7在php中实现继承*/  
class luteacher_cd extends luteacher{  
    public $quyu;  
    public $fangjia;  
    function fenxi(){  
        if ($this->quyu=="天府新区"){  
            $this->fangjia=12000;  
            echo "该老师所在区域房价".$this->fangjia."元。";   
            }else{  
                echo "该老师还未购房!";  
                }  
        }  
    }  
$b=new luteacher_cd();   
$b->name="路昊";  
$b->quyu="天府新区";  
$c=new luteacher_cd();  
$c->name="文博";  
$b->fenxi();  
$c->fenxi();  
//$a->fenxi();//a不属于luteacher_cd  
  
  
/*6.7.1通过继承使用private、public和protected访问修饰控制符*/  
class luclassA{  
    public function lupublic(){echo "public extends luclassA.<br />";}  
    private function luprivate(){echo "private extends luclassA.<br />";}  
    protected function luprotected(){echo "protected extends luclassA.<br />";}  
    }  
class luclassB extends luclassA{  
    public $a;  
    public function extendss(){  
            $this->luprotected();  
            //return parent::luprivate();//不能通过parent::来调用已经被private的操作  
        }  
    }  
  
$lua=new luclassA();  
$lua->lupublic();  
$lub=new luclassB;  
//$lub->lupublic();  
$lub->extendss();  
  
/*6.7.2重载*/  
class luA{  
    public $a="1",$b="2",$c="3";  
    function d(){  
        echo "it's default.";  
        }  
    }  
$v1=new luA;  
echo "<br />".$v1->a.$v1->b.$v1->c."<br />";  
class luB extends luA{  
    public $b="b";  
    function d(){  
        echo "it's diffrent.";  
        }  
    function e(){  
        $this->d();  
        parent ::d();  
        //return parent ::$b;//此处报错,因为parent只可以用于操作不能用于变量。  
        }     
    }  
$v2=new luB;  
echo "<br />".$v2->a.$v2->b.$v2->c."<br />";  
//子类将继承超类所有属性和操作,但是如果子类提供了替代定义,那么替代定义优先。  
echo $v2->e();  
  
  
/*学习中发现一个奇怪的例子*/  
//可以通过parent ::参数传递的方法,调用的父类的private属性的东西  
class luuA{  
    private $a="a";  
    private $b="b";  
    public $d="d";  
    protected $e="e";  
    public function c(){  
        $a=$this->a."x";//此处$a和$this->a不是一个东西哦  
        echo $this->a.$this->d.$this->e.$a;  
        }//我认为是这样的:在类里面如果使用了$this->a的a是一个private属性,那么$this->不因a被重写替代定而改变。就算是再把a变成pulic也不行。public和protercted就没事。  
    }  
class luuB extends luuA{  
    public $a="aa";  
    public $d="dd";  
    protected $e="ee";  
    public function f(){  
        echo $this->a;  
        }  
    }  
  
$z=new luuA;  
echo $z->c()."<br />";  
$x=new luuB;  
echo $x->c();//虽然private $a被重写替代了,但是遇到this->了……  
$x->f();  
  
//privite 就像是一个锁住的属性。不让更改。  
//如果想要把父类private属性的值用到子类上,需要使用$this->,但是估计这个没什么用。  


/*插播一条代码打印前一天的时间*/
echo date("Y-m-d H:i:s",strtotime('-1 day',time()));




/*6.7.3使用final关键字来禁止继承和重载*/
//final只能修饰方法和类不能修饰属性,被修饰的方法不能在子类中覆盖到。lets try it。


final class luclass11{
	public $a="deafult";
	}
//class luclass12 extends luclass11{}//尝试继承会出现致命错误
class luclass13{
	protected $a="deafult";
	}
class luclass14 extends luclass13{
	final public function a(){//加上了final关键词仍然可以运行
		echo $this->a;
		}
	}
$c1=new luclass14;
$c1->a();
//private protected 不太一样
class luclass15 extends luclass14{
	
	}
$c2=new luclass15;
$c2->a();
//方法a()仍然可以被继承
class luclass16 extends luclass14{
	public function b(){
		$this->a();
		}	
	}
$c3=new luclass16;
$c3->b();
//方法a()仍然可以被调用
class luclass17 extends luclass14{
//	public function a(){//当方法a()被重载替换时报错
//		echo "im new a.";
//		}
	}


/*6.7.4PHP不支持多重继承*/
//对于已经继承了luclass14的luclass17,尝试让他再继承luclass13
//class luclass17 extends luclass13{}//此处报错Cannot redeclare class luclass17
interface jk1{
	function c();
	}


class jkclass1 implements jk1{
	public function a(){
		echo "a";		}
	public function c(){
		echo "c";		}
	}
	
$jk=new jkclass1;
$jk->a(); 
//这个例子没什么用,现在不懂接口有什么用






/*6.8类的设计*/
//(简化简单简洁)


/*6.9编写类代码*/
class testpage{
	public $content;
	public $title="这是一个页面的标题";
	public $keywords="关键词1,关键词2";
	public $button=array("home"=>"home.php",
						 "contact"=>"contact.php",
						 "servrices"=>"services.php",
						 "sitemap"=>"sitmap.php"
	);
	public function display(){
		echo "<html>\n<head>\n";
		$this->displaytitle();
		$this->displaykeywords();
		$this->displaystyles();
		echo "</head>\n</body>\n";
		$this->displayheader();
		$this->displaymenu($this->button);
		$this->content;
		$this->displayfooter();
		echo "</body>\n</html>";
		}
	}
/*__________以上代码是为了练手的 没有什么用处_____________*/






/*程序清单6-1*/
echo <<<AAA
<a href="page.inc">这是一个用灵活的方法来建立页面的方法</a>
<a href="home.php">这个是测试页面</a>
AAA;
//$fp=fopen("page.inc","w");//省事儿的建立一个文件的方法(没什么用记得注视掉)
//fclose($fp);//没什么用
//readfile("page.inc");
if((strpos($_SERVER['PHP_SELF'],"test/unit6.php"))==false){echo "jia";};
echo __FILE__;//在其它地方看到的好东西
//$fp=fopen("aboutme.php","w");//省事儿的建立一个文件的方法(没什么用记得注视掉)
//fclose($fp);//没什么用




//成功了用类建立页面 感觉很爽,自己给自己出题目尝试一下。
/*在文件夹news中,建立100个类似的页面,并且以时间命名,从当前时间向前推100天。明明格式为news20170920.php*/


/*先生成100个页面并且写入内容*/
/*把目录重置好*/
if(file_exists("news/newstitle.txt")){unlink("news/newstitle.txt");}
for($i=0;$i<100;$i++){
	$ei=$i-100;//提前的天数
	$newsdate=date("Ymd",strtotime("$ei day",time()));
	$fp=fopen("news/".$newsdate.".php","w+");
	$str='<?
	require("newspage.inc");
	$newspage=new newspage();
	$newspage->content="Today is '.$newsdate.'.<br /></br />";
	$newspage->display();
	?>';
	flock($fp,LOCK_EX);
	fwrite($fp,$str);
	flock($fp,LOCK_UN);
	fclose($fp);
	/*写一个文件来储存他们的名字*/
	$fp=fopen("news/newstitle.txt","a+");
	flock($fp,LOCK_EX);
	fwrite($fp,$newsdate."\r\n");
	flock($fp,LOCK_UN);
	fclose($fp);
	echo "<br />".($i+1)." ".$newsdate.".php...成功!";


	}
echo $thisfile=$_SERVER['DOCUMENT_ROOT']."test/";


//在一个业务繁忙的网站中,处理速度是很重要的,应当尽可能使用静态html网页,或者尽可能缓存脚本
//输出,从而减少在服务器中的载入工作
/*--------end---------*/


echo "<a href=\"unit6-2.php\">点击进入第二个unit6页面</a>";


fopen("unit6-2.php","w");






  
?>

unit6.2

<?
/*书接前文*/
/*6.10理解PHP面向对象的高级功能*/
/*使用per-class常量*/
class perclass{
	const a="123456789";
	public $b;
	
	public static function echoo(){
		echo"aaa";
		}
	}
	
class aaa extends perclass{};
echo perclass::a;
perclass::echoo();
$a=new perclass ();

/* instanceof means 是一个实例属于xxx*/
if($a instanceof perclass){echo "属于";}
$b=new aaa();
if($b instanceof perclass){echo "属于";}
/*类的类型提示的思想*/
function aaaa(aaa $a){
	echo "right";
	}//意思是$a必须instanceof aaa
aaaa($b);

/*6.10.4延迟静态绑定*/
class AA{
	public static function who(){
		echo "11";
		}
	public static function test(){
		static::who();
		}	
	}
class BB extends AA{
	public static function who(){
		echo "22";
		}
	}

BB::test();//应该返回22
//接下来看不用static用this的区别

class CC{
	public function who(){
		echo "11";
		}
	public function test(){
		$this->who();
		}
	}
class DD extends CC{
	public function who(){
		echo "22";
		}
	}
$c=new DD();
$c->test();//应该返回22

class EE{
	private $who="11";//此处private和public、protected的值不一样
	public function test(){
		echo $this->who;
		}
	}
class FF extends EE{
	public $who="22";
	}

$d=new FF;
$d->test();//应该返回22
//综上所诉我记错了,只有$who为private的时候才会打印11
//综上所述所谓的延迟静态绑定就是如此的,只是一个解释而已,没什么用。这个是合乎实理的。
//教材只是为了说明父类函数test可以引用子类的static who,但是实际上我认为子类在创建的时候已经创建了一个
//子类的test,子类的test调用子类的who,多么合情合理啊。解释做什么呢?

/*6.10.5克隆对象*/
//没看明白有什么用,通过一个例子看看。
/*
$x=111;
$y=clone $x;
echo "<br />$x $y ";
$x=0;
echo "<br />$x $y ";
reset($x);
echo "<br />$x $y ";
*/
//例子运行失败 特么的clone只能用于对象。再来
$x=clone $d;
echo $x->who;//11
//难道不能用“=”吗?
$y=$d;
echo "M<br />";
$y->test();
//也可以啊…… 那有毛用?网上搜索了一下 指向不同的内存。
echo "<br />";
$d->who="new";
echo $x->who;//x是克隆的 新的内存
echo $y->who;//y是赋值的 跟着d变化 =自带&地址符

//搜第四内,好像和数不太一样?
$a1=1;
$b1=$a1;
$b2=&$a1;
$a1=2;
echo "<br />$a1 $b1 $b2";//果然不一样
@reset($a1);//reset好像是专门针对数组的,这条报错,不起作用
unset($a1);//会打断地址符的链接
$a1=3;
echo "<br />$a1 $b1 $b2";

/*6.10.6使用抽象类*/
abstract class chouxiang{}
//new chouxiang();//报错,抽象类不能实例化
//抽象类不能实例化 里面的方法也不能实现,真搞不懂有什么用,以后再看吧



/*6.10.7使用__call()重载方法*/
//这本书讲的不明白  我去别的地方看一下。
//__call如果在类中调用一个不存在的方法,就会自动调用__call
class studycall{
	function __call($name,$farray){
		echo "我被调用了!";
		}
	}
$call1=new studycall();
$call1->te22ast(1);
//现在懂了。。。试一发
class studycall2{
	public function __call($name,$farray){
		$farraystr="";
		foreach($farray as $v){$farraystr.=$v.",";}
		echo "<br />你所调用的函数function ".$name."()不存在!你输入的参数(".rtrim($farraystr,',').")我们无法计算。";
		}
	}

$call2=new studycall2();
$call2->displayname(2,3,"hiugsafil","ksdfgaiuhgo",22,"afhauhfioahwoeifhao");

/*6.10.8使用__autoload*/
//当实例化一个没有声明的类的时候调用,他不是类方法而是一个函数
function __autoload($name){
	include_once($name.".inc");
	echo "不要报错了啊!还是致命的!";
	//我在函数里加载一个类试试呢
	class luhao{}
		}

//@new luhao();
//卧槽 为什么还会报错?

echo "123";
//网上说用sql_autoload_register();试一下呢
//sql_autoload_register(function($class_name){echo"没有这个类,我报错了没?";});
//$a3=new luhao();
//也不行……
//估计是什么没打开吧……
$a5=new page();
$a5->display();
//原来是这样用的……我好孤独啊自己一个人学。。。

/*6.10.9实现迭代器和迭代……卧槽 看起来就好难*/
class myclass1{
	public $a=3;
	public $b=4;
	public $c=5;
	public $d=6;
	}
$e1=new myclass1();
foreach($e1 as $key=>$value){
	echo $key."=>".$value."<br />";
	}
//通过搜索了解了迭代和接口的意思(大概意思),文中的是一个基类,比较难懂,应该放弃,以后再看
//现在还不知道objectiterrator是不是系统自带的,如果不是的话要回来读懂它。
//接口类似于提前定义一个子类,迭代就是不停地换变量里的数据(还不确定)


/*6.10.10将类转化成字符串*/
//__tostring()尝试打印时会调用这个函数
//var_export()此函数返回关于传递给该函数的变量的结构信息,它和var_dump() 类似,不同的是其返回的表示是合法的 PHP 代码

class myclass2{
	public $a=2;
	public $b=3.14;
	public function __tostring(){
		//return var_export($this,true);//tostring 必须用return来使用这个var_export()函数
		echo"<br />";
		return var_dump($this);
		}
	}
$f=new myclass2;
print_r($f);
/*6.10.11使用反射*/

$classs=new reflectionclass ("page");//估计这个也是一个系统函数 它内部还带了一个__tostring
echo "<pre>".$classs."</pre>";

/*-------------------end unit6这一章迷迷糊糊看完了*/
?>


page.inc

<?php

class page{
	public $content;
	public $title="Luhao's test web.";
	public $keywords="luhao,test,husband";
	public $button=array("home"=>"home.php",
						 "contact"=>"contact.php",
						 "service"=>"services.php",
						 "sitemap"=>"sitemap.php",
						 "news"=>"news.php");
	public function __set($name,$value){
		$this->attribute=$value;
		}//感觉这个可以省略
	public function display(){
		echo "<html>\n<head>\n";
		$this->displaytitle();
		$this->displaykeywords();
		$this->displaystyle();
		echo "</head>\n<body>\n";
		$this->displayheader();
		$this->displaymenu($this->button);
		echo $this->content;
		$this->displayfooter();
		echo"</body>\n</html>\n";
		}
	public function displaytitle(){
		echo "<title>".$this->title."</title>";
		}
	public function displaykeywords(){
		echo "<meta name=\"keywords\" content=\"".$this->keywords."\">";
		}		
	public function displaystyle(){
		echo "
  <style>
    h1 {
    	color:white; font-size:24pt; text-align:center; 
        font-family:arial,sans-serif
    }
    .menu {
    	color:white; font-size:12pt; text-align:center; 
        font-family:arial,sans-serif; font-weight:bold
    }
    td {	
    	background:black
    }
    p {
    	color:black; font-size:12pt; text-align:justify; 
       	font-family:arial,sans-serif
    }
    p.foot {
    	color:white; font-size:9pt; text-align:center; 
        font-family:arial,sans-serif; font-weight:bold
    }
    a:link,a:visited,a:active {
    	color:white
    }
  </style>";
		}
	public function displayheader(){
		?>
		<table width="100%" cellpadding="2" cellspacing="0" border="0">
        	<tr bgcolor="#000000">
            	<td align="left"><img src="img/logo.gif" /></td>
                <td><h1>Luhao's Test Web</h1></td>
                <td align="right"><img src="img/logo.gif" /></td>
            </tr>
        </table>
		<?
		}
	public function displaymenu($button){
		echo "<table width=\"100%\" bgcolor=\"#FFFFFF\" cellpadding=\"4\" cellspacing=\"4\">\n<tr>\n";
		
		$width=100/count($button);
		while (list($name,$url)=each($button)){
			$this->displaybutton($width,$name,$url,$this->isurlcurrentpage($url));
			}
		echo"</tr>\n</table>\n";		
		}
	public function isurlcurrentpage($url){//判断是否是当前页面
		if(strpos($_SERVER['PHP_SELF'],$url)==false){
			return false;
			}else{
				return true;
				}
		}
	public function displaybutton($width,$name,$url,$active=false){
		if($active==false){
			echo "<td width=\"".$width."%\"><a href=\"".$url."\"><img src=\"img/s-logo.gif\" border=\"0\" /><span class=\"menu\">".$name."</span></a></td>";
			}elseif($active==true){
				echo "<td width=\"".$width."%\"><img src=\"img/side-logo.gif\" border=\"0\" /><span class=\"menu\">".$name."</span></td>";
				}
		}	
	public function displayfooter(){
		?>
        <table width="100%" bgcolor="black" cellpadding="12" border="0">
        <tr>
        <td>
            <p class="foot">&copy; LuHao's WEB.</p>
            <p class="foot">Please see my <a href ="aboutme.html">legal 
            information page</a></p>
        </td>
        </tr>
        </table>
		<?
		}
					
	}
	
?>

home.php(其他的都差不多)

<?
require("page.inc");
$homepage=new page();
$homepage->content="Welcome to my page.";
$homepage->display();
?>
///

news.php

<?
require("page.inc");
$newstitle=file("news/newstitle.txt");
$ahref="";
foreach($newstitle as $v){
	$ahref.= "<a href=\"news/".$v.".php\" style=\"color:red\">".$v."</a><br />";
	}
//echo $ahref;	
$newspage=new page();
$newspage->content="<center>THESE ARE SOME NEWS.<br /></br />".$ahref."</center>";
$newspage->display();


?>

/

news/newspage.inc


<?
require("../page.inc");
class newspage extends page{
	public function displayheader(){
		?>
		<table width="100%" cellpadding="2" cellspacing="0" border="0">
        	<tr bgcolor="#000000">
            	<td align="left"><img src="../img/logo.gif" /></td>
                <td><h1>Luhao's Test Web</h1></td>
                <td align="right"><img src="../img/logo.gif" /></td>
            </tr>
        </table>
		<?
		}
	public function displaybutton($width,$name,$url,$active=false){
		if($active==false){
			echo "<td width=\"".$width."%\"><a href=\"../".$url."\"><img src=\"../img/s-logo.gif\" border=\"0\" /><span class=\"menu\">".$name."</span></a></td>";
			}elseif($active==true){
				echo "<td width=\"".$width."%\"><img src=\"../img/side-logo.gif\" border=\"0\" /><span class=\"menu\">".$name."</span></td>";
				}
		}	
					 
					 
					 

	}
?>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值