PHP面向对象编程入门教程
<?php教程
/* 类的声明
* 1.你要开发的是什么,确定写什么类
* 2.类中的成员一定要属于这个类
* [修饰类的关键字] class 类名{
* 成员属性:
* 成员方法:
* }
* 3.在类中声明成员属性时,前面必须有修饰词,当不确定使用哪个词时,使用var或public
* 一个文件只保存一个类,文件名中包含类名,文件:类名.class.php
* 类名的写法:
* 变量:aaaBbbCcc
* 函数:aaaBbbCcc
* 常量:AAABBBCCC
* 类名:AaaBbbCcc
* 4.类中的成员属性,如果创建多个对象时,每个对象有不同的属性值时,不要直接给初值,在创建好对象之后再给值
*
*
* 通过类来实例化对象
* 1.使用的是new新建一个对象,加上类名,就是创建哪个类的对象
* $对象引用=new 类名;
* 2.只要有一个new 关键字就是创建一个对象,创建一个对象就是在内存中分配了一个空间
*
* 只有对象才在内存有存储空间
*
* 对象的作用
*
* 对象在内存中的分配
*
* 对象的使用
* 对象中的成员必须通过对象的引用来访问
* 对象->成员
*
* 对象->成员属性
* 对象->成员方法
*
*
*
*/
---------------------------------------------------<?php
class Something {
// 在OOP类中,通常第一个字符为大写
var $x;
function setX($v) {
// 方法开始为小写单词,然后使用大写字母来分隔单词,例如getValueOfArea()
$this->x=$v;
}
function getX() {
return $this->x;
}
}
?>---------------------------------------------------
当然你可以按自已的喜好进行定义,但最好保持一种标准,这样会更有效。
数据成员在类中使用"var"声明来定义,在给数据成员赋值之前,它们是没有类型的。一个数据成员可
以是一个整数,一个数组,一个相关数组(associative array)或者是一个对象。
方法在类中被定义成函数形式,在方法中访问类成员变量时,你应该使用$this->name,否则对一个方
法来说,它只能是局部变量。
使用new操作符来创建一个对象:
$obj=new Something;
然后你可以使用成员函数通过:
$obj->setX(5);
$see=$obj->getX();
在这个例子中,setX成员函数将5赋值给对象的成员变量x(不是类的),然后getX返回它的值5。
你可以象:$obj->x=6那样通过类引用方式来存取数据成员,这不是一个很好的OOP习惯。我强烈建议通
过方法来存取成员变量。如果你把成员变量看成是不可处理的,并且只通过对象句柄来使用方法,你将是一
个好的OOP程序员。不幸的是,PHP不支持声明私有成员变量,所以不良代码在PHP中也是允许的。
继承在PHP中很容易实现,只要使用extend关键字。
-----------------------------------------------------
<?phpclass Another extends Something {
var $y;
function setY($v) {
$this->y=$v;
}
function getY() {
return $this->y;
}
}?>---------------------------------------------------
//类的声明(电话类)
class Phone{
//声明属性
var $pinPai;
var $color;
var $batteryCapacity;
var $screenSize;//成员方法
function call(){
}function message(){
}
function playMusic(){
}
function photo(){
}
}//类的实例化
<?php
class Something {
var $x;function Something($y) {
$this->x=$y;
}function setX($v) {
$this->x=$v;
}function getX() {
return $this->x;
}
}?>---------------------------------------------------
所以你可以创建一个对象,通过:
$obj=new Something(6);
构造函数会自动地把6赋值给数据变量x。构造函数和方法都是普通的PHP函数,所以你可以使用缺省参数。
function Something($x="3",$y="5")
接着:
$obj=new Something(); // x=3 and y=5
$obj=new Something(8); // x=8 and y=5
$obj=new Something(8,9); // x=8 and y=9
缺省参数使用C++的方式,所以你不能忽略Y的值,而给X一个缺省参数,参数是从左到右赋值的,如果
传入的参数少于要求的参数时,其作的将使用缺省参数。
当一个派生类的对象被创建时,只有它的构造函数被调用,父类的构造函数没被调用,如果你想调用基
类的构造函数,你必须要在派生类的构造函数中显示调用。可以这样做是因为在派生类中所有父类的方法都
是可用的。
-----------------------------------------------------
<?php
function Another() {
$this->y=5;
$this->Something();
//显示调用基类构造函数
}?>---------------------------------------------------
class Person{
var $name;
var $age;
var $sex;function say(){
}
function eat(){
}
function run(){
}
}
//实例化
$p1=new Person;
$p2=new Person;
$p3=new Person;<?php
$obj=new Classfoo();
$str=serialize($obj);//保存$str到磁盘上
//几个月以后
//从磁盘中装入str$obj2=unserialize($str)
?>---------------------------------------------------
你恢复了成员数据,但是不包括方法(根据文档所说)。这导致了只能通过类似于使用$obj2->x来存取
成员变量(你没有别的方法!)的唯一办法,所以不要在家里试它。//访问对象的成员
$p1->name="zhangsan";
echo $p1->name;
?>
先给出一条结论,然后我们在用代码来证明这个结论吧。$arrtmp=$arr;在这个赋值表达式中我把$arr叫做赋值数组,把$arrtmp叫做被赋值数组。数 组在赋值时,如果赋值数组的数组指针已经指向了数组末尾,则赋值之后赋值数组的数组指针会被重置,指向数组第一个元素;如果在赋值时,赋值数组的数组指针 没有指向数组末尾,而是指向了任何一个有效的数组元素,那么在赋值之后赋值数组的数组指针是不会被重置的,而是保留其原来指向的元素。在赋值之后,被赋值 数组不仅有了赋值数组的值,而且赋值数组的数组指针指向了那个元素,被赋值的数组也会指向自己中值相同的那个元素。
demo1:
<?php教程
$arr = array('var1'=>1,'var2'=>2,'var3'=>3,'var4'=>4,'var5'=>5);
while( list($key,$value) = each($arr) )
{
if($value == 4) break;
}
var_dump(current($arr));$arr1 = $arr;
var_dump(current($arr));
var_dump(current($arr1));
?>
demo1 的执行结果是:int(5) int(5) int(5) 。从这个结果可以看出,赋值前后$arr的数组指针位置没有发生任何变化,$arr1不仅值跟$arr相同,而且数组指针所指向的元素值也是相同的。现在 用上述结论来解释这个结果,在while循环中,有一个if判断语句,目的是不让$arr的数组指针指向数组末尾,而是保留在一个有效的位置。 在$value=4时会跳出循环,而each这个函数会将数组指针向前移动一位,这就导致了$arr的数组指针指向了第5个元素,所以在赋值之 前,current($arr)的结果是5,赋值之后,由于在赋值之前$arr的当前指针并没有指向末尾,因此在赋值之后不会将$arr的数组指针进行重 置,而是保留了其原有的位置,因此在赋值之后使用current($arr)的结果仍然是5。赋值时$arr1不仅获得了$arr的值,而且数组指针指向 的元素和$arr的相同,二者都是5。
demo2:
<?php
$arr = array('var1'=>1,'var2'=>2,'var3'=>3,'var4'=>4,'var5'=>5);
while( list($key,$value) = each($arr) )
{
//if($value == 4) break;
}
var_dump(current($arr));$arr1 = $arr;
var_dump(current($arr));
var_dump(current($arr1));
?>
demo2中我们将 if($value == 4) break; 这一句注释掉了,目的很简单,就是通过each将$arr的数组指针位置指向数组末尾。
demo2 的执行结果:bool(false) int(1) bool(false) 。如果数组指针对应的元素为0,“”,或者不是一个有效的值时,current函数会返回false,$arr的值中没有为0或者“”的情况,因此可以断 定是因为数组指针指向了一个无效的元素而导致current返回了一个false。换句话说就是可以确定在while循环完成之后,$arr的数组指针已 经指向了数组的末尾。所以我们看到在赋值之前current($arr)的值是false,而赋值之后current($arr)的值变成了1,说明赋值 之后$arr的数组指针被重置了,指向了数组的第一个元素。current($arr1)的值为false,说明赋值之后$arr1让然保留了赋值之 前$arr的数组指针指向的元素。
不知道描述清楚没有,还是将工作中问题简化一下,用下面代码说明一下吧。
<?php
$arr = array('var1'=>1,'var2'=>2,'var3'=>3,'var4'=>4,'var5'=>5);
while( list($key,$value) = each($arr) )
{
$$key = $value;
}
//下面这一步操作很关键,问题就出在这里,遍历完之后,对数组添加一个值。
$arr['var6'] = 6;
func($arr);
function func($arrtmp)
{
while(list($key,$value) = each($arrtmp) )
{
$$key = $value;
}
var_dump($var1);
var_dump($var2);
var_dump($var3);
var_dump($var4);
var_dump($var5);
var_dump($var6);
}
?>
输出结果:NULL NULL NULL NULL NULL int(6).
php教程 scandir遍历显示所有文件与文件夹下的文件,方法很简单我们只要利用is_dir判断再递归查找一次,这样就可以把遍历目录下所有文件了。
目录遍历
<?php
function numfilesindir ($thedir){
if (is_dir ($thedir)){
$scanarray = scandir ($thedir);
for ($i = 0; $i < count ($scanarray); $i++){
if ($scanarray[$i] != "." && $scanarray[$i] != ".."){
if (is_file ($thedir . "/" . $scanarray[$i])){
echo $scanarray[$i] . "<br />";
}
}
}
} else {
echo "Sorry, this directory does not exist.";
}
}
echo numfilesindir ("sample1");?>
扫描指定位置的文件
<?php
print_r(scandir("/usr/local/apache2/htdocs"));
?><?
$files = scandir(".", 1);
var_dump($files);
?>
cookie 是由服务器发送到浏览器的变量。cookie 通常是服务器嵌入到用户计算机中的小文本文件。每当计算机通过浏览器请求一个页面,就会发送这个 cookie。
实例
<?php教程
echo( "Cookie created? : " . setcookie("cookie_name", "cookie_data" ) );
?>
<html>
<head>
<title>Cookie</title>
</head><body>
</body>
</html>
如果要删除 cookie只要设置cookie的过期时间就行了,
实例
<?php
setcookie ( "cookie_user", "test", time () + 60 * 60 * 24 * 30 );
setcookie ( "cookie_pass", md5 ( "test" ), time () + 60 * 60 * 24 * 30 );function logout() {
setcookie ( "cookie_user", "", time () + 60 * 60 * 24 * 30 );
setcookie ( "cookie_pass", "", time () + 60 * 60 * 24 * 30 );
}
logout ();
echo $_COOKIE ['cookie_user'] . "<br />";
echo "You have successfully logged out.";
?>
我们在开发中经常会用到cookie自动登录
实例
<?php
$GLOBALS['username'] = "test";
$GLOBALS['password'] = "test";
function validatelogin ($username, $password){
if (strcmp ($username, $GLOBALS['username']) == 0 && strcmp ($password, $GLOBALS['password']) == 0){
setcookie ("cookie_user", $username, time()+60*60*24*30);
setcookie ("cookie_pass", md5 ($password), time()+60*60*24*30);
return true;
} else {
return false;
}
}
if (validatelogin ("test","test")){
echo "Successfully logged in.";
} else {
echo "Sorry, invalid login.";
}
?>
读取团购网站的api的php教程程序
$arr = array(
array("http://www.meituan.com/api/deals/hao123","url","美团网"),);
class AminoAcid {
var $name;
var $symbol;
var $code;
var $type;
function AminoAcid ($aa){
foreach ($aa as $k=>$v)
$this->$k = $aa[$k];
}
}
function readDatabase($filename,$label){
$data = implode("",file($filename));
$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
xml_parse_into_struct($parser, $data, $values, $tags);
xml_parser_free($parser);
foreach ($tags as $key=>$val) {
if ($key == $label) {
$molranges = $val;
for ($i=0; $i < count($molranges); $i+=2) {
$offset = $molranges[$i] + 1;
$len = $molranges[$i + 1] - $offset;
$tdb[] = parseMol(array_slice($values, $offset, $len));
}
} else {
continue;
}
}
return $tdb;
}
function parseMol($mvalues){
for ($i=0; $i < count($mvalues); $i++) {
$mol[$mvalues[$i]["tag"]] = $mvalues[$i]["value"];
}
return new AminoAcid($mol);
}foreach($arr as $key => $value){
$r = readDatabase($value[0],$value[1]);
print_r($r);//打印出来解析出来的信息
}
相关文章
- 这篇文章主要介绍了java8如何用Stream查List对象某属性是否有重复的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-11
- 这篇文章主要介绍了R语言删除指定变量或对象的操作方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
- 这篇文章主要介绍了JavaScript预解析,对象的的相关资料,小编觉得这篇文章写的还不错,需要的朋友可以参考下,希望能够给你带来帮助...2021-11-10
- 这篇文章主要给大家介绍的是关于Lua语言新手入门的简单教程,文中通过示例代码一步步介绍的非常详细,对各位新手们的入门提供了一个很方便的教程,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。...2020-06-30
如何在Spring WebFlux的任何地方获取Request对象
这篇文章主要介绍了如何在Spring WebFlux的任何地方获取Request对象,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下...2021-01-26牛叉的Jquery――Jquery与DOM对象的互相转换及DOM的三种操作
只有jQuery对象才能调用jQuery类库的各种函数,同样有些dom对象的属性和方法在jQuery上也是无法调用的,不过基本上jQuery类库提供的函数包含了所有的dom操作。这就需要我们知道如何将jQuery对象和DOM的相互转换的方法。1...2015-10-30- js调试中经常会碰到输出的内容是对象而无法打印的时候,光靠alert只能打印出object标示,却不能打印出来里面的内容,甚是不方便,于是各方面整理总结了如下一个函数,能够将数组或者对象这类的结果一一打印出来,具体代码如下: fu...2015-10-21
- 这篇文章主要介绍了javascript self对象使用详解的相关资料,需要的朋友可以参考下...2016-10-20
- 本文给大家介绍如何替换json对象中的key,通过实例代码给大家介绍key的替换方法,代码也很简单,需要的朋友参考下吧...2021-06-02
- 这篇文章主要介绍了详解Javascript中的Object对象,需要的朋友可以参考下...2016-03-01
- 这篇文章主要介绍了C#线程入门教程之单线程介绍,本文讲解了什么是进程、什么是线程、什么是多线程等内容,并给出了一个单线程代码示例,需要的朋友可以参考下...2020-06-25
- 在web页面中,图片居左,内容居右排列,是非常常见的效果,它也就是媒体对象,它是一种抽象的样式,可以用来构建不同类型的组件。本文给大家介绍Bootstrap媒体对象的实现,感兴趣的朋友一起学习吧...2016-05-04
ActiveX部件不能创建对象:dm.dmsoft代码:800A01AD
vbs调用插件报:ActiveX部件不能创建对象,代码:800A01AD,一般是因为病毒导致dll文件丢失或者64系统问题导致,需要的朋友可以参考下...2020-06-30- 这篇文章主要为大家介绍了JavaScript事件对象,了解JavaScript事件...2016-01-26
- 这篇文章主要介绍了Javascript对象,特别为大家分享了对象题目的一个坑,提供了解题思路,感兴趣的小伙伴们可以参考一下...2015-12-24
- 这篇文章主要介绍了Xml中使用foreach遍历对象实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-12-04
- 下面小编就为大家带来一篇javascript创建对象的几种模式介绍。小编觉得挺不错的,现在分享给大家,也给大家做个参考...2016-05-09
解决SpringCloud Feign传对象参数调用失败的问题
这篇文章主要介绍了解决SpringCloud Feign传对象参数调用失败的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-24- 这篇文章主要介绍了JavaScript Blob对象原理及用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-10-14
- 这篇文章主要介绍了JS实现简单面向对象的颜色选择器,以完整实例形式分析了JavaScript基于面向对象实现颜色选择器的具体步骤与实现技巧,需要的朋友可以参考下...2016-04-23