PHP入门笔记--基础语法二
一、函数
- 自定义函数 - 任何有效的 PHP 代码都有可能出现在函数内部,甚至包括其它函数和类定义。 - <?php
 function foo()
 {
 function bar()
 {
 echo "I don't exist until foo() is called.\n";
 }
 } /* 现在还不能调用bar()函数,因为它还不存在 */ foo(); /* 现在可以调用bar()函数了,因为foo()函数
 的执行使得bar()函数变为已定义的函数 */ bar(); ?>
 
- PHP 中的所有函数和类都具有全局作用域,可以定义在一个函数之内而在之外调用,反之亦然。 
- PHP 不支持函数重载,也不可能取消定义或者重定义已声明的函数。 
 
- 函数的参数 - 参数是从左向右求值 
- 默认参数, 注意当使用默认参数时,任何默认参数必须放在任何非默认参数的右侧 - <?php
 function makecoffee($types = array("cappuccino"), $coffeeMaker = NULL)
 {
 $device = is_null($coffeeMaker) ? "hands" : $coffeeMaker;
 return "Making a cup of ".join(", ", $types)." with $device.\n";
 }
 echo makecoffee();
 echo makecoffee(array("cappuccino", "lavazza"), "teapot"); function makeyogurt($flavour, $type = "acidophilus")
 {
 return "Making a bowl of $type $flavour.\n";
 }
 echo makeyogurt("raspberry"); // works as expected
 ?>
 
 
- 返回值 - 返回一个数组以得到多个返回值。 - <?php
 function small_numbers()
 {
 return array (0, 1, 2);
 }
 list ($zero, $one, $two) = small_numbers();
 ?>
 
- 从函数返回一个引用。必须在函数声明和指派返回值给一个变量时都使用引用运算符 &。 - <?php
 function &returns_reference()
 {
 return $someref;
 } $newref =& returns_reference();
 ?>
 
 
- 可变函数 - PHP 支持可变函数的概念。这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。 - <?php
 function foo() {
 echo "In foo()<br />\n";
 } function bar($arg = '') {
 echo "In bar(); argument was '$arg'.<br />\n";
 } // 使用 echo 的包装函数
 function echoit($string)
 {
 echo $string;
 } $func = 'foo';
 $func(); // This calls foo() $func = 'bar';
 $func('test'); // This calls bar() $func = 'echoit';
 $func('test'); // This calls echoit()
 ?>
 - 当调用静态方法时,函数调用要比静态属性优先。 
二、类与对象
- 基本概念 - $this - 当一个方法在类定义内部被调用时,有一个可用的伪变量$this。$this 是一个到主叫对象的引用(通常是该方法所从属的对象,但如果是从第二个对象静态调用时也可能是另一个对象)。 - <?php
 class A
 {
 function foo()
 {
 if (isset($this)) {
 echo '$this is defined (';
 echo get_class($this);
 echo ")\n";
 } else {
 echo "\$this is not defined.\n";
 }
 }
 } class B
 {
 function bar()
 {
 // Note: the next line will issue a warning if E_STRICT is enabled.
 A::foo();
 }
 } $a = new A();
 $a->foo(); //$this is defined (A) // Note: the next line will issue a warning if E_STRICT is enabled.
 A::foo(); //$this is not defined.
 $b = new B();
 $b->bar(); //$this is defined (B) // Note: the next line will issue a warning if E_STRICT is enabled.
 B::bar(); //$this is not defined.
 ?>
 
- new - 当创建新对象时该对象总是被赋值,除非该对象定义了构造函数并且在出错时抛出了一个异常。类应在被实例化之前定义。 - 在类定义内部,可以用 new self 和 new parent 创建新对象。 
- extends - 一个类可以在声明中用 extends 关键字继承另一个类的方法和属性。PHP不支持多重继承,一个类只能继承一个基类。 - 被继承的方法和属性可以通过用同样的名字重新声明被覆盖。但是如果父类定义方法时使用了final,则该方法不可被覆盖。可以通过parent:: 来访问被覆盖的方法或属性。 - 当覆盖方法时,参数必须保持一致否则 PHP 将发出 E_STRICT 级别的错误信息。但构造函数例外,构造函数可在被覆盖时使用不同的参数。 - <?php
 class ExtendClass extends SimpleClass
 {
 // Redefine the parent method
 function displayVar()
 {
 echo "Extending class\n";
 parent::displayVar();
 }
 } $extended = new ExtendClass();
 $extended->displayVar();
 ?>
 
- ::class - 关键词 class 也可用于类名的解析。使用 ClassName::class 你可以获取一个字符串,包含了类 ClassName 的完全限定名称。这对使用了 命名空间 的类尤其有用。 - <?php
 namespace NS {
 class ClassName {
 } echo ClassName::class; //NS\ClassName
 }
 ?>
 
 
- 属性 - 访问控制:public,protected 和 private - 在类的成员方法里面,可以用 ->(对象运算符):$this->property(其中 property 是该属性名)这种方式来访问非静态属性。静态属性则是用 ::(双冒号):self::$property 来访问。 
- 类常量 - 在定义和使用常量的时候不需要使用 $ 符号。 - <?php
 class MyClass
 {
 const constant = 'constant value'; function showConstant() {
 echo self::constant . "\n";
 }
 } echo MyClass::constant . "\n"; $classname = "MyClass";
 echo $classname::constant . "\n"; // 自 5.3.0 起 $class = new MyClass();
 $class->showConstant(); echo $class::constant."\n"; // 自 PHP 5.3.0 起
 ?>
 
- 类的自动加载 - 很多开发者为每个类新建一个 PHP 文件。 这会带来一个烦恼:每个脚本的开头,都需要包含(include)一个长长的列表(每个类都有个文件)。 - spl_autoload_register() 函数可以注册任意数量的自动加载器,当使用尚未被定义的类(class)和接口(interface)时自动去加载。通过注册自动加载器,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。 - 本例尝试分别从 MyClass1.php 和 MyClass2.php 文件中加载 MyClass1 和 MyClass2 类。 
   <?php
   spl_autoload_register(function ($class_name) {
       require_once $class_name . '.php';
   });
   $obj  = new MyClass1();
   $obj2 = new MyClass2();
   ?>
- 构造函数和析构函数 - void __construct ([ mixed - $args[,- $...]] )- 如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct()。如果子类没有定义构造函数则会如同一个普通的类方法一样从父类继承(假如没有被定义为 private 的话)。 - <?php
 class BaseClass {
 function __construct() {
 print "In BaseClass constructor\n";
 }
 } class SubClass extends BaseClass {
 function __construct() {
 parent::__construct();
 print "In SubClass constructor\n";
 }
 } class OtherSubClass extends BaseClass {
 // inherits BaseClass's constructor
 } // In BaseClass constructor
 $obj = new BaseClass(); // In BaseClass constructor
 // In SubClass constructor
 $obj = new SubClass(); // In BaseClass constructor
 $obj = new OtherSubClass();
 ?>- void __destruct ( void ) - 析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。 - <?php
 class MyDestructableClass {
 function __construct() {
 print "In constructor\n";
 $this->name = "MyDestructableClass";
 } function __destruct() {
 print "Destroying " . $this->name . "\n";
 }
 } $obj = new MyDestructableClass();
 ?>- 和构造函数一样,父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数体中显式调用 parent::__destruct()。此外也和构造函数一样,子类如果自己没有定义析构函数则会继承父类的。 
PHP入门笔记--基础语法二的更多相关文章
- Python入门篇-基础语法
		Python入门篇-基础语法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.编程基础 1>.程序 一组能让计算机识别和执行的指令. 程序 >.算法+ 数据结构= 程 ... 
- 《Java笔记——基础语法》
		Java笔记--基础语法 一.字符串的拼接: 例如: System.out.println(""+""); 二.换行语句: 例如: Syst ... 
- Python 基础语法(二)
		Python 基础语法(二) --------------------------------------------接 Python 基础语法(一) ------------------------ ... 
- web前端学习python之第一章_基础语法(二)
		web前端学习python之第一章_基础语法(二) 前言:最近新做了一个管理系统,前端已经基本完成, 但是后端人手不足没人给我写接口,自力更生丰衣足食, 所以决定自学python自己给自己写接口哈哈哈 ... 
- Python入门 —— 02基础语法
		基础语法入门学习推荐: 简明 Python 教程 下文仅为入门推荐书籍的补充与重点 多行语句:末尾使用斜杠 ( ) ,将一行分为多行 var = item1 + item2 + item3 注释: ... 
- Qt入门之基础篇 ( 二 ) :Qt项目建立、编译、运行和发布过程解析
		转载请注明出处:CN_Simo. 题解: 本篇内容主讲Qt应用从创建到发布的整个过程,旨在帮助读者能够快速走进Qt的世界. 本来计划是讲解Qt源码静态编译,如此的话读者可能并不能清楚地知道为何要静态编 ... 
- python2.7入门---简介&基础语法
		Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言,具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构.基于上述原因, ... 
- JavaScript快速入门-ECMAScript基础语法
		一.JavaScript引入方式 1.行内式 <script> alert(123); </script> 2.外链式 <script src='custom.js'&g ... 
- JavaScript学习笔记-基础语法、类型、变量
		基础语法.类型.变量 非数字值的判断方法:(因为Infinity和NaN他们不等于任何值,包括自身) 1.用x != x ,当x为NaN时才返回true; 2.用isNaN(x) ,当x为NaN或 ... 
随机推荐
- 【Linux】Linux远程登陆
			登录任务 Windows主机--远程登录--Linux主机 一.登陆前提准备 1.1 确保网络通畅 确保从Windows 能够Ping通Linux 1.2 关闭Linux防火墙 //前提:以root管 ... 
- unity导出apk错误出错解决方法
			CommandInvokationFailure: Failed to re-package resources. See the Console for details. F:\adt-bundle ... 
- jdk时区相差8小时
			设置JVM的默认时区为东八区(北京时间)在下面四个目录(jre6\lib\zi\Etc.jre6\lib\zi.jdk1.6.0_18\jre\lib\zi\Etc.jdk1.6.0_18\jre\l ... 
- JUnit_BeforeClass不报异常的 bug 处理
			1.try{} cathce(Exception e){}将觉得会出问题的地方括起来测试. 2.main方法调用出问题的方法. 
- 清理SharePoint 2010的SQL Server 2008 R2日志数据库的方法
			最近发现Sharepoint的数据库磁盘经常满,导致无法保存数据,经检查发现数据磁盘的所有日志文件远远大于数据文件,因此需要收缩日志文件,一开始利用图形化的收缩文件方式,只有收缩数据文件的大小,对于日 ... 
- 不同系统里同一Customizing activity的显示差异分析
			比如SAP HANA Live Reporting这个Customizing Activity,在System AG3里不可见,但是在另一个系统QHD里却能使用.比较下列两张图的差异. 一种可能的原因 ... 
- codeforces 611D New Year and Ancient Prophecy
			f[i = 以i结尾][j = 长度为j] = 方案数. f[i][j] = sum{ f[i-j][k] , k < j || (k == j && s(i-j+1,j) &g ... 
- HDU 1853 MCMF
			题意:给定一个有向带权图,使得每一个点都在一个环上,而且权之和最小. 分析:每个点在一个环上,入度 = 出度 = 1,拆点入点,出点,s到所有入点全部满载的最小费用MCMF; #include < ... 
- POJ 1416 Shredding Company【dfs入门】
			题目传送门:http://poj.org/problem?id=1416 Shredding Company Time Limit: 1000MS Memory Limit: 10000K Tot ... 
- logback.xml常用配置
			一.logback的介绍 Logback是由log4j创始人设计的又一个开源日志组件.logback当前分成三个模块:logback-core,logback- classic和logback-acc ... 
