分类 PHP 下的文章

PHP7 新特性

  1. 运算符(NULL 合并运算符)

$a = $_GET['a'] ?? 1;

相当于:

$a = isset($_GET['a']) ? $_GET['a'] : 1;

我们知道三元运算符是可以这样用的:

$a ?: 1

但是这是建立在 $a 已经定义了的前提上。新增的 ?? 运算符可以简化判断。

  1. 函数返回值类型声明

function arraysSum(array ...$arrays): array

{

  return array_map(function(array $array): int {

    return array_sum($array);

  }, $arrays);

}

print_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));

以上例程会输出:

Array
(

[0] => 6
[1] => 15
[2] => 24

)

强制模式:

function foo($a) : int

{

  return $a;

}

foo(1.0);

以上代码可以正常执行,foo 函数返回 int 1,没有任何错误。

严格模式:

declare(strict_types=1);

function foo($a) : int

{

  return $a;

}

foo(1.0);

PHP Fatal error: Uncaught TypeError: Return value of foo() must be of the type integer, float returned in test.php:6

在声明之后,就会触发致命错误。

  1. 标量类型声明

PHP 7 中的函数的形参类型声明可以是标量了。在 PHP 5 中只能是类名、接口、array 或者 callable (PHP 5.4,即可以是函数,包括匿名函数),现在也可以使用 string、int、float和 bool 了。

官方示例:

// Coercive mode

function sumOfInts(int ...$ints)

{

  return array_sum($ints);

}

var_dump(sumOfInts(2, '3', 4.1));

以上例程会输出:

int(9)
需要注意的是上文提到的严格模式的问题在这里同样适用:强制模式(默认,既强制类型转换)下还是会对不符合预期的参数进行强制类型转换,严格模式下则触发 TypeError 的致命错误。

  1. use 批量声明

PHP 7 中 use 可以在一句话中声明多个类或函数或 const 了:

use some/namespace/{ClassA, ClassB, ClassC as C};

use function some/namespace/{fn_a, fn_b, fn_c};

use const some/namespace/{ConstA, ConstB, ConstC};

但还是要写出每个类或函数或 const 的名称(并没有像 python 一样的 from some import * 的方法)。

需要留意的问题是:如果你使用的是基于 composer 和 PSR-4 的框架,这种写法是否能成功的加载类文件?其实是可以的,composer 注册的自动加载方法是在类被调用的时候根据类的命名空间去查找位置,这种写法对其没有影响。

  1. 太空舱操作符(组合比较操作符)

太空船操作符用于比较两个表达式。当$a小于、等于或大于$b时它分别返回-1、0或1。 比较的原则是沿用 PHP 的常规比较规则进行的。

// Integers
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1

// Floats
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1

// Strings
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1

  1. 通过 define() 定义常量数组

Array 类型的常量现在可以通过 define() 来定义。在 PHP5.6 中仅能通过 const 定义。

define('ANIMALS', [

'dog',
'cat',
'bird'

]);

echo ANIMALS[1]; // outputs "cat"
?>

  1. 迭代器

通过添加 yield 关键字支持了 generators,Generators 提供了一个更简单的方法实现迭代器,不需要实现 Iterator 接口

$gen = (function() {

yield 1;
yield 2;

return 3;

})();

foreach ($gen as $val) {

echo $val, PHP_EOL;

}

echo $gen->getReturn(), PHP_EOL;

以上例程会输出:

1
2
3

  1. 匿名类

现在支持通过new class 来实例化一个匿名类,这可以用来替代一些“用后即焚”的完整类定义。

interface Logger {

public function log(string $msg);

}

class Application {

private $logger;

public function getLogger(): Logger {
     return $this->logger;
}

public function setLogger(Logger $logger) {
     $this->logger = $logger;
}

}

$app = new Application;
$app->setLogger(new class implements Logger {

public function log(string $msg) {
    echo $msg;
}

});

var_dump($app->getLogger());
以上例程会输出:

object(class@anonymous)#2 (0) {
}

详细文档可以参考 匿名类.

  1. 闭包 Closure::call()

Closure::call() 现在有着更好的性能,简短干练的暂时绑定一个方法到对象上闭包并调用它。

class A {private $x = 1;}

// Pre PHP 7 code
$getXCB = function() {return $this->x;};
$getX = $getXCB->bindTo(new A, 'A'); // intermediate closure
echo $getX();

// PHP 7+ code
$getX = function() {return $this->x;};
echo $getX->call(new A);

以上例程会输出:

1
1

CGI、FastCGI和PHP-FPM关系图解[转]

806469-20160927081043813-1021846367.png
806469-20160927081047438-329876066.png

当Web Server收到 index.php 这个请求后,会启动对应的 CGI 程序,这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程,Web server再把结果返回给浏览器。这就是一个完整的动态PHP Web访问流程,接下来再引出这些概念,就好理解多了.

CGI:是 Web Server 与 Web Application 之间数据交换的一种协议。
FastCGI:同 CGI,是一种通信协议,但比 CGI 在效率上做了一些优化。同样,SCGI 协议与 FastCGI 类似。
PHP-CGI:是 PHP (Web Application)对 Web Server 提供的 CGI 协议的接口程序。
PHP-FPM:是 PHP(Web Application)对 Web Server 提供的 FastCGI 协议的接口程序,额外还提供了相对智能一些任务管理。
Web Server: 一般指Apache、Nginx、IIS、Lighttpd、Tomcat等服务器,
Web Application: 一般指PHP、Java、Asp.net等应用程序。
806469-20160927081051563-2122907811

Web Server启动时载入FastCGI进程管理器(Apache Module或IIS ISAPI等)
FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可建多个php-cgi),并等待来自Web Server的连接。
当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。
FastCGI子进程完成处理后,将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待,并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。 在CGI模式中,php-cgi在此便退出了。
FastCGI与CGI特点:

对于CGI来说,每一个Web请求PHP都必须重新解析php.ini、重新载入全部扩展,并重初始化全部数据结构。而使用FastCGI,所有这些都只在进程启动时发生一次。一个额外的好处是,持续数据库连接(Persistent database connection)可以工作。
由于FastCGI是多进程,所以比CGI多线程消耗更多的服务器内存,php-cgi解释器每进程消耗7至25兆内存,将这个数字乘以50或100就是很大的内存数。
806469-20160927081052328-1825068850.png

1、CGI是公共网关接口,是HTTP服务与其它程序“交谈”的工具。
2、fastcgi是一个常驻行 CGI ,是CGI的一个扩展,让CGI解释器常驻内存,提供性能。
3、php-cgi是fastcgi的php版本。
4、php-fpm是php-cgi的管理器,能够实现平滑更改php.ini的配置。

转载

PHP 插件扩展大全


国外程序员整理的 PHP 资源大全



ziadoz 在 Github 发起维护的一个 PHP 资源列表,内容包括:库、框架、模板、安全、代码分析、日志、第三方库、配置工具、Web 工具、书籍、电子书、经典博文等等。



依赖管理



依赖和包管理库



Composer/Packagist:一个包和依赖管理器



Composer Installers:一个多框架Composer库安装器



Pickle:一个PHP扩展安装器







其他的依赖管理



其他的相关依赖管理



Satis:一个静态Composer存储库生成器



Composition:一个在运行时检查Composer环境的库



Version:语义版本的解析和比较库



NameSpacer -转化下划线到命名空间的库



Patch Installer -使用Composer安装补丁的库



Composer Checker -校验Composer配置的工具







框架



Web开发框架



Symfony2 -一个独立组件组成的框架



-另一个由独立组件组成的框架



Laravel 4 -另一个PHP框架



Aura PHP -独立组件的框架



Yii2 – 另一个PHP框架



Nette – 另一个由个体组件组成的框架



PPI fr<x>amework 2 -一个互操作性框架



Phalcon -通过C扩展实现的框架







其他框架



其他Web开发框架



Symfony CMF – 创建自定义CMS的内容管理框架



Knp RAD Bundle -Symfony 2的快速应用程序(RAD)包







框架组件



来自web开发框架的独立组件



Symfony2 Components -Symfony2组件



-ZF2组件



Aura Components -PHP5.4组件包



Hoa Project -另一个PHP组件包







微型框架



微型框架和路由



Silex – 基于Symfony2组件的微型框架



– 另一个简单的微型框架



Bullet PHP -用于构建REST APIs的微型框架



Fast Route – 快速路由库



Pux -另一个快速路由库







其他微型框架



其他相关的微型框架和路由



Silex Skeleton -Silex的项目架构



Silex Web Profiler -Silex web调试工具条



Stack – Silex/Symfony的可堆叠中间件库



Slim Skeleton -Slim架构



Slim View -Slim的自定义视图集合



Slim Middleware -Slim的自定义中间件集合







模板



模板化和词法分析的库和工具



Twig -一个全面的模板语言



Twig Cache Extension -一个用于Twig的模板片段缓存库



Mustache -一个Mustache模板语言的PHP实现



Phly Mustache -另一个Mustache模板语言的PHP实现



MtHaml – 一个HAML 模板语言的PHP实现



PHPTAL -一个 TAL 模板语言的PHP实现



Plates -一个原生PHP模板



Lex -一个轻量级模板解析器







静态站点生成器



预处理工具来生成web页面的内容。



Sculpin -转换Markdown和Twig为静态HTML的工具



Phrozn – 另一个转换Textile,Markdown和Twig为HTML的工具







HTTP



用于HTTP和网站爬取的库



Guzzle -一个全面的HTTP客户端



Buzz -另一个HTTP客户端



Requests -一个简单的HTTP库



HTTPFul -一个链式HTTP库



Goutte -一个简单的web爬取器



PHP VCR -录制和重放HTTP请求的库







URL



解析URL的库



Purl -一个URL处理库



PHP Domain Parser -一个本地前缀解析库







Email



发送和解析邮件的库



SwiftMailer – 一个邮件解决方案



PHPMailer – 另一个邮件解决方案



Fetch -一个IMAP库



Email Reply Parser -一个邮件回复解析库



Stampie -邮件服务库,不如 SendGrid, PostMark, MailGunMandrill.



-一个在邮件模板内联CSS的库







文件



文件处理和MIME类型检测库



Gaufrette -一个文件系统抽象层



Flysystem – 另一个文件系统抽象层



Canal -一个检测互联网媒体类型的库



Apache MIME Types -一个解析Apache MIME类型的库



Ferret – 一个MIME检测库



Hoa Mime -另一个MIME检测库



Lurker -一个资源跟踪库



PHP File Locator -一个在大型项目定位文件的库



PHP FFmpeg -一个用于FFmpeg 视频包装的库.



CSV – 一个CSV数据处理库







Streams 流



处理流的库



Streamer – 一个面向对象的流包装库







Dependency Injection依赖注入



实现依赖注入设计模式的库



Pimple – 一个小的依赖注入容器



Auryn – 另一个依赖注入容器



Orno Di -另一个可伸缩的依赖注入容器



PHP DI -一个使用注释实现的依赖注入



Acclimate -一个依赖注入容器和服务定位的通用接口







Imagery 图像



处理图像的库



Imagine -一个图像处理库



PHP Image Workshop -另一个图像处理库



Intervention Image -另一个图像处理库



-一个提取GIF动画帧信息的库



GIF Creator – 一个通过多张图片创建GIF动画的库



Image With Text -一个在图像中嵌入文本的库



Color Extractor -一个从图像中提取颜色的库







Testing 测试



测试代码和生成测试数据的库



PHPUnit -一个单元测试框架



DBUnit -PHPUnit的数据库测试库



ParaTest – PHPUnit的并行测试库



PHPSpec -基于功能点设计的单元测试库



Codeception -一个全栈测试框架



AspectMock – PHPUnit/ Codeception 模拟框架。



Atoum -一个简单的测试库



Mockery -一个用测试的模拟对象库



Phake -另一个用测试的模拟对象库



Prophecy -一个可选度很高的模拟框架



Faker -一个伪数据生成库



Samsui – 另一个伪数据生成库



Alice -富有表现力的一代库



Behat -一个行为驱动开发(BDD)测试框架



Pho -一个行为驱动开发测试框架



Mink -Web验收测试



HTTP Mock – 一个在单元测试模拟HTTP请求的库



VFS Stream -一个用于测试的虚拟文件系统流的包装器



VFS -另一个用于测试虚拟文件系统



Locust -一个用Python编写的现代加载测试库







Continuous Integration 持续集成



持续集成的库和应用



Travis CI – 一个持续集成平台



PHPCI -一个PHP的开源持续集成平台



Sismo – 一个持续测试服务库



Jenkins一个 PHP 支持的持续集成平台



JoliCi – 一个用PHP编写的由Docker支持的持续集成客户端







Documentation 文档



生成项目文档的库



Sami -一个API文档生成器



APIGen -另一个API文档生成器



PHP Documentor 2 -一个API文档生成器



phpDox – 一个PHP项目的文档生成器(不限于API文档)







Security 安全



生成安全的随机数,加密数据,扫描漏洞的库



HTML Purifier -一个兼容标准的HTML过滤器



RandomLib -一个生成随机数和字符串的库



True Random -使用 www.random.org生成随机数的库



SecurityMultiTool -一个PHP安全库



PHPSecLib -一个纯PHP安全通信库



TCrypto -一个简单的键值加密存储库



PHP IDS – 一个结构化的PHP安全层



PHP SSH -一个试验的面向对象的SSH包装库



IniScan -一个扫描PHP INI文件安全的库



SensioLabs Security Check -一个为检查Composer依赖提供安全建议的web工具



Zed – 一个集成的web应用渗透测试工具







Passwords 密码



处理和存储密码的库和工具



Password Compat -一个新的PHP5.5密码函数的兼容库



phpass – 一个便携式的密码哈希框架



PHP Password Lib -一个生成和校验密码的库



Password Policy – 一个PHP和ja<x>vasc<x>ript的密码策略库



Password Validator – 校验和升级密码哈希的库



Zxcvbn PHP -一个基于Zxcvbn JS的现实的PHP密码强度估计库







Code Analysis 代码分析



分析,解析和处理代码库的库的工具



PHP Parser -一个PHP编写的PHP解析器



PHPPHP – 一个PHP实现的PHP虚拟机



PHPSandbox -一个PHP沙盒环境



Dissect -一个词法和语法分析的工具集合



PHP Mess Detector -一个扫描代码缺陷,次优代码,未使用的参数等等的库。



PHP Code Sniffer -一个检测PHP、CSS和JS代码标准冲突的库



PHPCPD – 一个检测复制和粘贴代码的库



PHP Analyser -一个分析PHP代码查找缺陷和错误的库



PHP CS Fixer – 一个编码标准库



PHP Manipulator -一个分析和修改PHP源代码的库



PHP Metrics -一个静态测量库



PHP Refactoring Browser -一个重构PHP代码的命令行工具集



UBench – 一个简单的微型基准检测库



Athletic -一个基于注释的基准检测库



Mondrian – 使用使用图论的代码分析工具



Scrutinizer -一个审查PHP代码的web工具



PHPLOC -一个快速测量PHP项目大小的工具



xHprof -另一个PHP分析工具



-一个帮助遵守特定的编码惯例的工具。







Debugging 调试



调试代码的库和工具



xDebug -一个调试和分析PHP的工具



PHP Debug Bar – 一个调试工具栏



PHP Console -一个web调试控制台



Barbushin PHP Console -另一个使用Google Chrome的web调试控制台



PHPDBG – 一个交互的PHP调试器



Tracy -一个简单的错误检测,写日志和时间测量库







Build Tools 构建工具



项目构建和自动化工具



Go -一个简单的PHP构建工具



Bob – 一个简单的项目自动化工具



Phake -一个PHP克隆库



Box – 一个构建PHAR文件的工具



Phing -一个灵感来自于Apache Ant的PHP项目构建系统







Task Runners 任务运行器



自动运行任务的库



Task -一个灵感来源于Grunt和Gulp的纯PHP任务运行器



Robo -一个面向对象配置的PHP任务运行器



Bldr -一个构建在Symfony组件上的PHP任务运行器







Navigation导航



构建导航结构的工具



KnpMenu – 一个菜单库



Cartographer -一个站点地图生成库







Asset Management 资源管理



管理,压缩和最小化web站点资源的工具



Assetic – 一个资源管理的管道库



Pipe -另一个资源管理的管道库



Munee -一个资源优化库



JShrink -一个ja<x>vasc<x>ript最小化库



Puli – 一个检测资源绝对路径的库







Geolocation 地理位置



为地理编码地址和使用纬度经度的库。



GeoCoder -一个地理编码库



GeoTools -一个地理工具相关的库



PHPGeo -一个简单的地理库



GeoJSON -一个地理JSON的实现







Date and Time 日期和时间



处理日期和时间的库



Carbon – 一个简单的日期时间API扩展



ExpressiveDate -另一个日期时间API扩展



CalendR – 一个日历管理库







Event 事件



时间驱动或非阻塞事件循环实现的库



React -一个事件驱动的非阻塞I/O库



Rx.PHP – 一个reactive扩展库



Ratchet – 一个web套接字库



Hoa WebSocket -另一个web套接字库



Hoa EventSource -一个事件源库



Evenement -一个事件分发库



FuelPHP Event -另一个事件分发库







Logging 日志



生成和处理日志文件的库



Monolog – 一个全面的日志工具



KLogger -一个易用的PSR-3兼容的日志类







E-commerce 电子商务



处理支付和构建在线电子商务商店的库和应用



OmniPay -一个框架混合了多网关支付处理的库



Payum – 一个支付抽象库



Sylius – 一个开源的电子商务解决方案



Thelia -另一个开源的电子商务解决方案



Money – 一个Fowler金钱模式的PHP实现



Sebastian Money -另一个处理货币值的库



Swap -一个汇率库







PDF



处理PDF文件的库和软件



Snappy -一个PDF和图像生成器库



WKHTMLToPDF -一个将HTML转换为PDF的工具







Databa<x>se 数据库



使用对象关系映射(ORM)或数据映射技术的数据库交互库



Doctrine -一个全面的DBAL和ORM



Doctrine Extensions -一个Doctrine行为扩展的集合



Propel – 一个快速的ORM,迁移库和查询构架器



-Laravel 4 ORM



Baum -一个Eloquent的嵌套集实现



Spot2 -一个MySQL的ORM映射器



RedBean -一个轻量级,低配置的ORM



Pomm -一个PostgreSQL对象模型管理器



ProxyManager -一个为数据映射生成代理对象的工具集







Migrations 迁移



帮助管理数据库模式和迁移的库



PHPMig -另一个迁移管理库



Phinx – 另一个数据库迁移管理库



Migrations -一个迁移管理库



Doctrine Migrations -一个Doctrine迁移库







NoSQL



处理NoSQL后端的库



MongoQB -一个MongoDB查询构建库



Monga -一个MongoDB抽象库



Predis – 一个功能完整的Redis库







Queue 队列



处理事件和任务队列的库



Pheanstalk -一个Beanstalkd 客户端库



PHP AMQP -一个纯PHP AMQP库



Thumper – 一个RabbitMQ模式库



Bernard -一个多后端抽象库







Search 搜索



在数据上索引和执行查询的库和软件



ElasticSearch PHP -ElasticSearch的官方客户端库



Elastica -ElasticSearch的客户端库



Solarium -Solr的客户端库



SphinxQL query builder -Sphinx搜索引擎的的查询库







Command Line 命令行



构建命令行工具的库



Boris – 一个微型PHP REPL



PsySH – 另一个微型PHP REPL



Pecan -一个事件驱动和非阻塞内核



GetOpt – 一个命令行选择解析器



OptParse -另一个命令行选择解析器



Commando -另一个简单的命令行选择解析器



GetOptionKit -另一个命令行选择解析器



-计算cron运行日期的库



ShellWrap -一个简单的命令行包装库



Hoa Console -另一个命令行库



Shunt – 一个在多台远程机器上并行运行命令行的库



Cilex -一个构建命令行工具的微型框架







Authentication 身份验证



实现身份验证的库



Sentry -一个混合的身份验证和授权的框架库



Sentry Social -一个社交网络身份验证库



Opauth -一个多渠道的身份验证框架



OAuth2 -一个OAuth2身份验证服务,资源服务器和客户端库



OAuth2 Server -另一个OAuth2服务器实现



PHP oAuthLib -另一个OAuth库



TwitterOAuth -一个Twitter OAuth库



TwitterSDK -一个完全测试的Twitter SDK



Hawk -一个Hawk HTTP身份认证库



HybridAuth -一个开源的社交登陆库







Markup 标记



处理标记的库



Decoda -一个轻量级标记解析库



PHP Markdown -一个Markdown解析器



CommonMark PHP -一个对 CommonMark spec全支持的Markdown解析器



Dflydev Markdown -另一个Markdown解析器



Parsedown -另一个Markdown解析器



Ciconia – 另一个支持Github Markdown风格的Markdown解析器



Cebe Markdown -一个快速的可扩展的Markdown解析器



HTML5 PHP – 一个HTML5解析和序列化库







Strings 字符串



解析和处理字符串的库



ANSI to HTML5 -ANSI到HTML5的转化库



Patchwork UTF-8 -一个处理UTF-8字符串的便携库



Hoa String -另一个UTF-8字符串库



Stringy -一个多字节支持的字符串处理库



Color Jizz -处理和转换颜色的库



UUID – 生成UUIDs的库



Slugify -转换字符串到slug的库



Urlify – 一个Django的 URLify.jsPHP通道



Text – 一个文本处理库



SQL Formatter -一个格式化SQL语句的库



UA Parser – 一个解析用户代理字符串的库







Numbers 数字



处理数字的库



Numbers PHP -处理数字的库



Math -处理大数字的库



ByteUnits – 在二进制和度量系统中解析,格式化和转换字节单元的库



PHP Units of Measure -一个计量单位转换的库



PHP Conversion – 另一个计量单位转换的库



LibPhoneNumber for PHP -Google电话号码处理的PHP实现库







Filtering and Validation 过滤和验证



过滤和验证数据的库



Filterus – 一个简单的PHP过滤库



Respect Validate -一个简单的验证库



Valitron -另一个验证库



Upload – 一个处理文件上传和验证的库



DMS Filter – 一个注释过滤库



-一个支持YAML,JSON和xm<x>l的模式验证库



ISO-codes -验证各种ISO和ZIP编码的库(IBAN, SWIFT/BIC, BBAN, VAT, SSN, UKNIN)







REST和API



开发REST-ful API的库和web工具



Apigility -一个使用Zend fr<x>amework 2构建的API构建器



Hateoas -一个HOATEOAS REST web服务库



HAL -一个超文本应用语言(HAL)构建库



Negotiation -一个内容协商库



Drest -一个将Doctrine实体暴露为REST资源节点的库



Restler -一个将PHP方法暴露为RESTful web API的轻量级框架







Caching 缓存



缓存数据的库



Alternative PHP Cache (APC) – 打开PHP伪代码缓存



Cache -一个缓存库(Doctrine部分)



Stash -另一个缓存库







数据结构和存储



实现数据结构和存储技术的库



Ardent -一个数据结构库



PHP Collections – 一个简单的集合库



Serializer -一个序列化和反序列化数据的库



-一个对象存储库



Fractal -一个转换复杂数据结构到JSON输出的库



Totem -一个管理和穿件数据交换集的库



PINQ -一个PHP实时Linq库



JsonMapper -一个将内嵌JSON结构映射为PHP类的库







Notifications 通知



处理通知软件的库



Nod -一个通知库(Growl等)



Notificato – 一个处理推送通知的库



Notification Pusher -一个设备推送通知的独立库



Notificator -一个轻量级的通知库







Deployment 部署



项目部署库



Pomander -一个PHP应用部署工具



Rocketeer -PHP世界里的一个快速简单的部署器



Envoy -一个用PHP运行SSH任务的工具



Plum – 一个部署库







国际化和本地化



国际化(I18n)和本地化(L10n)



Aura.Intl







第三方API



访问第三方API的库



Amazon Web Service SDK – PHP AWS SDK官方库



S3 Stream Wrapper -Amazon S3流包装库



Stripe -Stripe官方PHP库



Campaign Monitor -Campaign Monitor官方PHP库



Digital Ocean -Digital Ocean API 接口库



Github – Github API交互库



PHP Github API -另一个Github API交互库



Twitter OAuth -Twitter OAuth工作流交互库



Twitter REST – Twitter REST API交互库



Dropbox SDK – The official PHP Dropbox SDK library.



Dropbox SDK – Dropbox SDK官方PHP库



Twilio – The official Twilio PHP REST API.



Twilio – Twilio官方PHP REST API



Mailgun The official Mailgun PHP API.



Mailgun Mailgun官方PHP REST API







Extensions 扩展



帮组构建PHP扩展的库



Zephir -用于开发PHP扩展,且介于PHP和C++之间的编译语言



PHP CPP -一个开发PHP扩展的C++库







Miscellaneous 杂项



不在上面分类中的有用库和工具



Spork -一个处理forking的库



JSON Lint – 一个JSON lint工具



JSONPCallbackValidator -验证JSONP回调的库



Pagerfanta -一个分页库



Ruler – 一个简单的无状态的生产环境规则引擎。



LiteCQRS -一个CQRS(命令查询责任分离)库



Sslurp – 一个使得SSL处理减少的库



PHP Option一个可选的类型库



Metrics -一个简单的度量API库



– 一个解析VCard和iCalendar对象的库



Annotations -一个注释库(Doctrine部分)



Whoops -一个不错的错误处理库



Finite -一个简单的PHP有限状态机



LadyBug -一个dumper库



Procrastinator -运行耗时任务的库



Compose -一个功能组合库



SuperClosure -一个允许闭包序列化的库



Jumper – 一个远程服务执行库



Underscore -一个Undersccore JS库的PHP实现



PHP PassBook -一个iOS PassBook PHP库



-一个PHP表达式语言



RMT – 一个编写版本和发布软件的库



Wise – 一个配置管理器



Opengraph -一个开放图库



Essence -一个提取web媒体的库



Embera -一个Oem<x>bed消费库



Graphviz -一个图形库



Monad PHP 一个简单Monad库



Flux -一个正则表达式构建库



Patchwork – 一个重新定义用户的函数库



Galapagos -语言转换进化



Design Patterns PHP -一个使用PHP实现的设计模式存储库



PHPCR – 一个Java内容存储库(JCR)的PHP实现



Functional PHP – 一个函数式编程库



ClassPreloader – 一个优化自动加载的库



Lib Country -一个国家和地区数据的库



Lib Accessor -一个简化访问的库



PHPStack -一个PHP编写的TCP/IP栈概念



Nmap -一个Nmap PHP包装器



Code Mover -一个移动代码的库



Iter -一个使用生成器提供迭代原语的库



Lambda PHP -一个PHP中的Lambda 计算解析器



Country List – 所有带有名称和ISO 3166-1编码的国家列表



PHP-GPIO – 用于Raspberry PI的GPIO pin的库



print_o – 一个对象图的可视化器



Alias -一个类别名库







Software 软件



创建一个开发环境的软件



PHP安装



在你的电脑上帮助安装和管理PHP的工具



HomeBrew -一个OSX包管理器



HomeBrew PHP -一个HomeBrew的PHP通道



PHP OSX – 一个OSX下的PHP安装器



PHP Brew -一个PHP版本管理和安装器



PHP Env – 另一个PHP版本管理器



PHP Switch – 另一个PHP版本管理器



PHP Build – 另一个PHP版本安装器



VirtPHP – 一个创建和管理独立PHP环境的工具







Development Environment 开发环境



创建沙盒开发环境的软件和工具



Vagrant -一个便携的开发环境工具



Ansible – 一个非常简单的编制框架



Puppet -一个服务器自动化框架和应用



PuPHPet -一个构建PHP开发虚拟机的web工具



Protobox -另一个构建PHP开发虚拟机的web工具



Phansible – 一个用Ansible构建PHP开发虚拟机的web工具







Virtual Machines 虚拟机



相关的PHP虚拟机



HipHop PHP -Facebook出品的PHP虚拟机,运行时和JIT



HippyVM -另一个PHP虚拟机



Hack – 一个PHP进行无缝操作的 HHVM编程语言



IDE 集成开发环境



支持PHP的集成开发环境



Netbeans -一个支持PHP和HTML5的IDE



Eclipse for PHP Developers -一个基于Eclipse平台的PHP IDE



PhpStorm -一个商业PHP IDE







Web Applications Web应用



基于Web的应用和工具



3V4L一个在线的PHP shell



DBV -一个数据库版本控制应用



PHP Queue -一个管理后端队列的应用



Composer as a Service – 作为一个zip文件下载Composer包的工具



MailCatcher – 一个抓取和查看邮件的web工具







Resources 资源



各种提高你的PHP开发技能和知识的资源,比如书籍,网站,文章



PHP网站



PHP相关的有用网站



PHP The Right Way -一个PHP最佳实践的快速指引手册



PHP Best Practices – 一个PHP最佳实践指南



PHP Weekly – 一个PHP新闻周刊



PHP Security – 一个PHP安全指南



PHP FIG – PHP框架交互组



PHP UG -一个帮助用户定位最近的PHP用户组(UG)的网站



Seven PHP -一个PHP社区成员采访的网站



Nomad PHP -一个在线PHP学习资源



PHP Mentoring -点对点PHP导师组织







Other Websites 其他网站



web开发相关的有用网站



The Open Web Application Security Project (OWASP) -一个开放软件安全社区



WebSec IO – 一个web安全社区资源



Web Advent -一个web开发人员日历



Semantic Versioning -一个解析语义版本的网站



Atlassian Git Tutorials -一个Git教程系列



Hg Init -一个Mercurial教程系列



Servers for Hackers – 一个关于服务器管理的新闻通讯



原文链接:http://www.kubiji.cn/topic-id2570.html

抽象类和接口

在开发的过程中或者在面试的过程中,总是会遇到这个问题,在自己的印象中还是比较模糊的,今天简单的写两条,这个网上也有很多,都大同小异。

抽象类

在声明类时有一个方法时抽象方法,那么这个类就是抽象类,抽象类要使用abstract关键字来修饰。
在抽象类中可以有不是抽象的成员方法和成员属性,但访问权限不能使用private关键字修饰为私有的。

<?php
    abstract class Person{
        protected $name;
        protected $country;
 
        function __construct($name="",$country="china"){
            $this ->name = $name;
            $this ->country = $country;
        }
 
        abstract function say();
        abstract function eat();
 
        function run(){
            echo "使用两条腿走路<br>";
        }
    }
?>

抽象类就像是一个“半成品”的类,在抽象类中有没有被实现的抽象方法,所以抽象类是不能被实例化的,即创建不了对象,也就不能直接使用它。
当子类继承抽象类以后,就必须把抽象类中的抽象方法按照子类自己的需要去实现。子类必须把父类中的抽象方法全部都实现,否则子类中还存在抽象方法,所以还是抽象类,也不能实例化对象。

接口

接口中声明的方法必须都是抽象方法,另外不能再接口中声明变量,只能使用const关键字声明为常量的成员属性,而且接口中所有成员都必须有public的访问权限。

使用extends关键字让一个接口去继承另一个接口,实现接口之间的扩展。

通过类去继承接口时需要使用implements关键字来实现,而并不是使用extends关键字完成。

如果需要使用接口中的成员,则需要通过子类去实现接口中的全部抽象方法,然后创建子类的对象去调用在子类中实现后的方法。

   <?php
      interface 接口名称{ //使用interface关键字声明接口
      常量成员 //接口中的成员属性只能是常量,不能是变量
      抽象方法 //接口中的所有方法必须是抽象方法,不能有非抽象的方法存在
      }
   ?>

<?php
interface one{
const CONSTANT = 'CONSTANT value';
function fun1();
function fun2();
}
 
//声明一个抽象类去实现接口One中的第二个方法
abstract class Three implements One{ //只实现接口中的一个抽象方法
function fun2(){
//具体的实现内容由子类自己决定
}
}
 
//声明一个类实现接口One中的全部抽象方法
class Four implements One{
function fun1(){
//具体的实现内容由子类自己决定
}
 
function fun2(){
//具体的实现内容由子类自己决定
}
}
 
?>

总结

1、对接口的使用是通过关键字implements。对抽象类的使用是通过关键字extends。当然接口也可以通过关键字extends继承。
2、接口中不可以声明成员变量(包括类静态变量),但是可以声明类常量。抽象类中可以声明各种类型成员变量,实现数据的封装。
3、接口没有构造函数,抽象类可以有构造函数。
4、接口中的方法默认都是public类型的,而抽象类中的方法可以使用protected,public来修饰。
5、一个类可以同时实现多个接口,但一个类只能继承于一个抽象类。

文件上传

//文件存储路径
$file_path="upload/";
//664权限为文件属主和属组用户可读和写,其他用户只读。
if(is_dir($file_path)!=TRUE) mkdir($file_path,0664) ;
//定义允许上传的文件扩展名
$ext_arr = array("gif", "jpg", "jpeg", "png", "bmp", "txt", "zip", "rar");

if (empty($_FILES) === false) {

//判断检查
if($photo_up_size > 2097152){
    exit("对不起,您上传的照片超过了2M。");
}
if($_FILES["file"]["error"] > 0){
    exit("文件上传发生错误:".$_FILES["file"]["error"]);
}

//获得文件扩展名
$temp_arr = explode(".", $_FILES["file"]["name"]);
$file_ext = array_pop($temp_arr);
$file_ext = trim($file_ext);
$file_ext = strtolower($file_ext);
//检查扩展名
if (in_array($file_ext, $ext_arr) === false) {
    exit("上传文件扩展名是不允许的扩展名。");
}
//以时间戳重命名文件
$new_name = time().".".$file_ext;
//将文件移动到存储目录下
move_uploaded_file($_FILES["file"]["tmp_name"],"$file_path" . $new_name);
//向数据表写入文件存储信息以便管理
//*********** 代码略 ***********//
echo "文件上传成功!";
exit;

} else {

echo "无正确的文件上传";

}

PHP "类"-原则

三大特性是:封装、继承、多态
所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,
对不可信的进行信息隐藏。

封装是面向对象的特征之一,是对象和类概念的主要特性。 简单的说,
一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,
某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,
以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。

所谓继承是指可以让某个类型的对象获得另一个类型的对象的属性的方法,它支持按级分类的概念。

继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,
就是从一般到特殊的过程。要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。
继承概念的实现方式有二类:实现继承与接口继承。实现继承是指直接使用基类的属性和方法而无需额外编码的能力;
接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;

所谓多态就是指一个类实例的相同方法在不同情形有不同表现形式。

多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,
但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。

五大基本原则
单一职责原则SRP(Single Responsibility Principle)

是指一个类的功能要单一,不能包罗万象。如同一个人一样,分配的工作不能太多,否则一天到晚虽然忙忙碌碌的,
但效率却高不起来。

开放封闭原则OCP(Open-Close Principle)

一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。比如:一个网络模块,原来只服务端功能,
而现在要加入客户端功能,
那么应当在不用修改服务端功能代码的前提下,就能够增加客户端功能的实现代码,这要求在设计之初,
就应当将服务端和客户端分开,公共部分抽象出来。

替换原则(the Liskov Substitution Principle LSP)

子类应当可以替换父类并出现在父类能够出现的任何地方。比如:公司搞年度晚会,所有员工可以参加抽奖,
那么不管是老员工还是新员工,
也不管是总部员工还是外派员工,都应当可以参加抽奖,否则这公司就不和谐了。

依赖原则(the Dependency Inversion Principle DIP) 具体依赖抽象,上层依赖下层。

假设B是较A低的模块,但B需要使用到A的功能,这个时候,B不应当直接使用A中的具体类: 而应当由B定义一抽象接口,
并由A来实现这个抽象接口,B只使用这个抽象接口:这样就达到
了依赖倒置的目的,B也解除了对A的依赖,反过来是A依赖于B定义的抽象接口。通过上层模块难以避免依赖下层模块,
假如B也直接依赖A的实现,那么就可能造成循环依赖。一个常见的问题就是编译A模块时需要直接包含到B模块的cpp文件,
而编译B时同样要直接包含到A的cpp文件。

接口分离原则(the Interface Segregation Principle ISP)

模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来