[{"data":1,"prerenderedAt":64},["ShallowReactive",2],{"article-69":3},{"code":4,"msg":5,"data":6,"count":14},200,"查询成功",{"id":7,"title":8,"keywords":9,"description":10,"category_id":11,"content":12,"body_html":13,"thumb_up":14,"clicks":15,"sort":14,"remark":16,"status":17,"is_open":17,"is_deleted":14,"is_top":14,"is_recommend":14,"create_time":18,"update_time":19,"image_id":20,"url":13,"member_id":14,"cate_name":21,"prev":22,"next":25,"tags":28,"words":34,"read_time":35,"comments":36,"cover":37,"relevant":38},69,"PHP常见知识点整理","php,变量","1、print(),echo,print_r(),var_dump()的区别\n\n```bash\n1、echo和print都可以做输出，不同的是，echo不是函数，没有返回值，而print是一个函数有返回值，所以相对而言如果只是输出echo会更快，而print_r通常用于打印变量的相关信息，通常在调试中使用。 \n2、print   是打印字符串 \n3、print_r 则是打印复合类型  如数组 对象\n4、print_r()和var_dump()都是函数。\n5、print_r()格式化打印变量。但p",2,"1、print(),echo,print_r(),var_dump()的区别\n\n```bash\n1、echo和print都可以做输出，不同的是，echo不是函数，没有返回值，而print是一个函数有返回值，所以相对而言如果只是输出echo会更快，而print_r通常用于打印变量的相关信息，通常在调试中使用。 \n2、print   是打印字符串 \n3、print_r 则是打印复合类型  如数组 对象\n4、print_r()和var_dump()都是函数。\n5、print_r()格式化打印变量。但print_r()输出布尔值和NULL的结果没有意义，打印true返回1，null则不显示。\n6、var_dump()也是格式化打印变量。但会详细的打印出变量的类型，长度，数值，如果包含多层将递归打印。更适合调试。\n\n```\n\n2、SESSION和COOKIE的区别\n\n```bash\n1、存储位置：session存储于服务器，cookie存储于浏览器\n2、安全性：session安全性比cookie高\n3、session为‘会话服务’，在使用时需要开启服务，cookie不需要开启，可以直接用\n```\n\n3、include 和 require 有什么区别?include 和 include_once 又有什么区别? \n\n```bash\ninclude 和 require 都能把另外一个文件包含到当前文件中\ninclude 就是包含，如果被包含的文件不存在的话， 那么则会提示一个错误，但是程序会继续执行下去。\nrequire 意思是需要，如果被包含文件不存在或者 无法打开的时候，则会提示错误，并且会终止程序的执行。\nonce 的意思是一次，那么 include_once 和 require_once 表示只包含一次，避免重复包含。\n```\n\n4、 用 php 写出显示客户端 IP 与服务器 IP 的代码 \n\n```bash\n客户端 IP:$_SERVER[“REMOTE_ADDR”]\n服务器 IP:$_SERVER[“SERVER_ADDR”]\n```\n\n5、PHP常见的设计模式\n\n```bash\n工厂模式、单例模式、注册模式、适配器模式、观察者模式、策略模式、原型模式、装饰器模式\n\n工厂模式:\n用工厂方法代替new操作的一种模式，如果需要更改所实例化的类名，只需在工厂方法内修改，不需逐一寻找代码中具体实例化的地方。\n\n单例模式:\n防止重复实例化，避免大量的new操作，减少消耗系统和内存的资源，使得有且仅有一个实例对象。\n\n注册模式:\n解决全局共享和交换对象。已经创建好的对象，挂在到某个全局可以使用的数组上，在需要使用的时候，直接从该数组上获取即可。将对象注册到全局的树上。任何地方直接去访问。\n\n适配器模式:\n将各种截然不同的函数接口封装成统一的API。\nPHP中的数据库操作有MySQL,MySQLi,PDO三种，可以用适配器模式统一成一致，使不同的数据库操作，统一成一样的API。类似的场景还有cache适配器，可以将memcache,redis,file,apc等不同的缓存函数，统一成一致。\n首先定义一个接口(有几个方法，以及相应的参数)。然后，有几种不同的情况，就写几个类实现该接口。将完成相似功能的函数，统一成一致的方法。\n\n观察者模式:\n1：观察者模式(Observer)，当一个对象状态发生变化时，依赖它的对象全部会收到通知，并自动更新。\n2：场景:一个事件发生后，要执行一连串更新操作。传统的编程方式，就是在事件的代码之后直接加入处理的逻辑。当更新的逻辑增多之后，代码会变得难以维护。这种方式是耦合的，侵入式的，增加新的逻辑需要修改事件的主体代码。\n3：观察者模式实现了低耦合，非侵入式的通知与更新机制。\n\n策略模式，将一组特定的行为和算法封装成类，以适应某些特定的上下文环境。\neg：假如有一个电商网站系统，针对男性女性用户要各自跳转到不同的商品类目，并且所有的广告位展示不同的广告。在传统的代码中，都是在系统中加入各种if else的判断，硬编码的方式。如果有一天增加了一种用户，就需要改写代码。使用策略模式，如果新增加一种用户类型，只需要增加一种策略就可以。其他所有的地方只需要使用不同的策略就可以。\n首先声明策略的接口文件，约定了策略的包含的行为。然后，定义各个具体的策略实现类。\n\n原型模式:\n原型模式（对象克隆以避免创建对象时的消耗）\n1：与工厂模式类似，都是用来创建对象。\n2：与工厂模式的实现不同，原型模式是先创建好一个原型对象，然后通过clone原型对象来创建新的对象。这样就免去了类创建时重复的初始化操作。\n3：原型模式适用于大对象的创建，创建一个大对象需要很大的开销，如果每次new就会消耗很大，原型模式仅需要内存拷贝即可。\n装饰器模式:\n1、装饰器模式，可以动态的添加修改类的功能\n2、一个类提供了一项功能，如果要在修改并添加额外的功能，传统的编程模式，需要写一个子类继承它，并重写实现类的方法\n3、使用装饰器模式，仅需要在运行时添加一个装饰器对象即可实现，可以实现最大额灵活性。\n```\n\n6、什么事面向对象？主要特征是什么？\n\n```bash\n面向对象是程序的一种设计方式，它利于提高程序的重用性，使程序结构更加清晰。\n主要特征：封装、继承、多态。\n```\n\n7、HTTP 状态中302、403、 500代码含义？ \n\n```bash\n一二三四五原则: \n一、消息系列  \n二、成功系列      \n三、重定向系列\n四、请求错误系列      \n五、服务器端错误系列\n302:临时转移成功，请求的内容已转移到新位置\n403:禁止访问 \n500:服务器内部错误 \n401:代表未授权。\n\nhttp状态码及其含意\n200 请求已成功，请求所希望的响应头或数据体将随此响应返回。\n301 被请求的资源已永久移动到新位置。\n302 请求的资源现在临时从不同的 URI 响应请求。\n400 1、语义有误，当前请求无法被服务器理解。2、请求参数有误。\n401 当前请求需要用户验证。\n403 服务器已经理解请求，但是拒绝执行它。\n404 请求失败，请求所希望得到的资源未被在服务器上发现。\n500 服务器遇到了一个未曾预料的状况，无法完成对请求的处理，会在程序码出错时出现。\n501 服务器不支持当前请求所需要的某个功能。无法识别请求的方法。\n502 作为网关或者代理工作的服务器尝试执行请求时，从上游服务器接收到无效的响应。\n503 由于临时的服务器维护或者过载，服务器当前无法处理请求。\n```\n\n8、isset() 和 empty() 区别\n\n```bash\nisset判断变量是否存在，可以传入多个变量，若其中一个变量不存在则返回假，\nempty判断变量是否为空为假，只可传一个变量，如果为空为假则返回真。\n```\n\n9、请说明 PHP 中传值与传引用的区别。什么时候传值什么时候传引用？\n\n```bash\n按值传递：函数范围内对值的任何改变在函数外部都会被忽略\n按引用传递：函数范围内对值的任何改变在函数外部也能反映出这些修改\n优缺点：按值传递时，php必须复制值。特别是对于大型的字符串和对象来说，这将会是一个代价很大的操作。按引用传递则不需要复制值，对于性能提高很有好处。\n```\n\n10、 对于大流量的网站,您采用什么样的方法来解决访问量问题 \n\n```bash\n首先，确认服务器硬件是否足够支持当前的流量\n其次，优化数据库访问。\n第三，禁止外部的盗链。\n第四，控制大文件的下载。\n第五，使用不同主机分流主要流量\n第六，使用流量分析统计软件\n```\n\n11、PHP 是否支持多重继承？\n\n```bash\nPHP 只支持单继承。PHP 的类使用关键字 `extends` 继承另一个类\n```\n\n12、冒泡排序\n\n```bash\nfunction maopao($arr)\n{\n    $len = count($arr);\n    $n = count($arr) - 1;\n    for ($i = 0; $i \u003C $len; $i++) {\n        for ($j = 0; $j \u003C $n; $j++) {\n            if ($arr[$j] > $arr[$j + 1]) {\n                $tmp = $arr[$j];\n                $arr[$j] = $arr[$j + 1];\n                $arr[$j + 1] = $tmp;\n            }\n        }\n    }\n    return $arr;\n}\n```\n\n13、快速排序\n\n```bash\nfunction quick_sort($array) {\n    if (count($array) \u003C= 1) return $array;\n    $key = $array[0];\n    $left_arr = array();\n    $right_arr = array();\n    for ($i=1; $i\u003Ccount($array); $i++){\n        if ($array[$i] \u003C= $key)\n            $left_arr[] = $array[$i];\n        else\n            $right_arr[] = $array[$i];\n    }\n    $left_arr = quick_sort($left_arr);\n    $right_arr = quick_sort($right_arr);\n    return array_merge($left_arr, array($key), $right_arr);\n}\n\n常见的排序算法: \n冒泡排序法、快速排序法、简单选择排序法、堆排序法、直接插入排序法、希尔排序法、合并排序法。\n```\n\n14、php的基本变量类型\n\n```bash\n四种标量类型：boolean （布尔型）、integer （整型）、float （浮点型, 也称作 double)、string （字符串）\n两种复合类型：array （数组）、object （对象）\n最后是两种特殊类型：resource（资源）、NULL（NULL）\n```\n\n15、如何处理负载、高并发\n\n```bash\n1、HTML静态化\n效率最高、消耗最小的就是纯静态化的html页面，所以我们尽可能使我们的 网站上的页面采用静态页面来实现，这个最简单的方法其实也是最有效的方法。\n\n2、图片服务器分离\n把图片单独存储，尽量减少图片等大流量的开销，可以放在一些相关的平台上，如七牛等\n\n3、数据库集群和库表散列及缓存\n数据库的并发连接为100，一台数据库远远不够，可以从读写分离、主从复制，数据库集群方面来着手。另外尽量减少数据库的访问，可以使用缓存数据库如memcache、redis。\n\n4、镜像：\n尽量减少下载，可以把不同的请求分发到多个镜像端。\n\n5、负载均衡：\nApache的最大并发连接为1500，只能增加服务器，可以从硬件上着手，如F5服务器。当然硬件的成本比较高，我们往往从软件方面着手。\n```\n\n16、单双引号区别\n\n```bash\n单引号内部的变量不会执行，双引号会执行\n单引号解析速度比双引号快\n单引号只能解析特殊字符，双引号可以解析所有特殊字符\n```\n\n17、PHP7的新特性\n\n```bash\n标量类型声明：\nPHP7 中的函数的形参类型声明可以是标量了。\n在PHP5中只能是类名、接口、array 或者 callable (PHP 5.4，即可以是函数，包括匿名函数)，现在也可以使用 string、int、float和 bool 了。\n\n返回值类型声明：\n增加了对返回类型声明的支持。 \n类似于参数类型声明，返回类型声明指明了函数返回值的类型。\n可用的类型与参数声明中可用的类型相同。\n\nNULL合并运算符：\n由于日常使用中存在大量同时使用三元表达式和isset()的情况，NULL合并运算符使得变量存在且值不为NULL，它就会返回自身的值，否则返回它的第二个操作数。\n\nuse加强：\n从同一namespace导入的类、函数和常量现在可以通过单个use语句一次性导入了\n\n匿名类：\n现在支持通过new class来实例化一个匿名类\n```\n\n18、isset,empty,is_null的区别\n\n```bash\nisset 判断变量是否定义或者是否为空\n变量存在返回ture，否则返回false\n变量定义不赋值返回false  unset一个变量，返回false\n变量赋值为null，返回false\n\nempty 判断变量的值是否为空，能转换为false的都是空，为空返回true，反之返回false。\n\"\",0,\"0\",NULL，FALSE都认为为空，返回true\n没有任何属性的对象都认为是空\n\nis_null 检测传入的值(值、变量、表达式)是否为null\n定义了，但是赋值为Null\n定义了，但是没有赋值 unset一个变量\n```\n\n19、了解XSS攻击吗？如何防止？\n\n```bash\nXSS是跨站脚本攻击，首先是利用跨站脚本漏洞以一个特权模式去执行攻击者构造的脚本，然后利用不安全的Activex控件执行恶意的行为。\n\n使用htmlspecialchars()函数对提交的内容进行过滤，使字符串里面的特殊符号实体化。\n```\n\n20、SQL注入漏洞产生的原因？如何防止？\n\n```bash\nSQL注入产生的原因：\n程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤，导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行。\n\n防止SQL注入的方式：\n\n开启配置文件中的magic_quotes_gpc 和 magic_quotes_runtime设置\n\n执行sql语句时使用addslashes进行sql语句转换\n\nsql语句书写尽量不要省略双引号和单引号。\n\n过滤掉sql语句中的一些关键词：update、insert、delete、select、 * 。\n\n提高数据库表和字段的命名技巧，对一些重要的字段根据程序的特点命名，取不易被猜到的。\n\nphp配置文件中设置register_globals为off,关闭全局变量注册\n\n控制错误信息，不要在浏览器上输出错误信息，将错误信息写到日志文件中。\n```\n\n21、PHP网站的主要攻击方式有哪些？\n\n```bash\n命令注入(Command Injection)\neval 注入(Eval Injection)\n客户端脚本攻击(Script Insertion)\n跨网站脚本攻击(Cross Site Scripting, XSS)\nSQL 注入攻击(SQL injection)\n跨网站请求伪造攻击(Cross Site Request Forgeries, CSRF)\nSession 会话劫持(Session Hijacking)\nSession 固定攻击(Session Fixation)\nHTTP 响应拆分攻击(HTTP Response Splitting)\n文件上传漏洞(File Upload Attack)\n目录穿越漏洞(Directory Traversal)\n远程文件包含攻击(Remote Inclusion)\n动态函数注入攻击(Dynamic Variable Evaluation)\nURL 攻击(URL attack)\n表单提交欺骗攻击(Spoofed Form Submissions)\nHTTP 请求欺骗攻击(Spoofed HTTP Requests)\n```\n\n22、 php序列化和反序列化用的函数 \n\n```bash\nserialize() 序列化\nunserialize() 反序列化\n```\n\n23、写一个email的正则表达式 \n\n```bash\n\u002F^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$\u002F\n```\n\n24、ThinkPHP框架\n\n```bash\nThinkPHP(FCS)是一个轻量级的中型框架，是从Java的Struts结构移植过来的中文PHP开发框架。它使用面向对象的开发结构和MVC模式，并且模拟实现了Struts的标签库，各方面都比较人性化，适合php框架初学者。 ThinkPHP的宗旨是简化开发、提高效率、易于扩展，\n\n其在对数据库的支持方面已经包括MySQL、MSSQL、Sqlite、PgSQL、 Oracle，以及PDO的支持。\n\nThinkPHP有着丰富的文档和示例，框架的兼容性较强，但是其功能有限，因此更适合用于中小项目的开发。\n\n优点：\n1、易于上手，有丰富的中文文档；\n2、框架的兼容性较强，PHP3和PHP5完全兼容、完全支持UTF8等。\n3、适合用于中小项目的开发。\n\n缺点：\n1、对Ajax的支持不是很好；\n2、目录结构混乱，需要花时间整理；\n3、上手容易，但是深入学习较困难；\n```\n\n25、Laravel框架\n\n```bash\nLaravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来；\n它可以帮你构建一个完美的网络APP，而且每行代码都可以简洁、富于表达力。\n\n优点：\nLaravel 的设计思想是很先进的，非常适合应用各种开发模式TDD, DDD 和BDD，作为一个框架，它准备好了一切，composer 是个php 的未来，没有composer，PHP 肯定要走向没落。\nlavarel 最大的特点和优秀之处就是集合了php 比较新的特性，以及各种各样的设计模式，IOC容器，依赖注入等。\n\n缺点：\n基于组件式的框架，所以比较臃肿。\n```\n\n26、Yii框架\n\n```bash\nYii 是一个基于组件的高性能php框架，用于开发大型Web应用。Yii采用严格的OOP编写，并有着完善的库引用以及全面的教程。\n\n从 MVC，DAO\u002FActiveRecord，widgets，caching，等级式RBAC，Web服务，到主题化，I18N和L10N，Yii提供了今日Web 2.0应用开发所需要的几乎一切功能。\n\n事实上，Yii是最有效率的PHP框架之一。\n\n优点：\n1、纯OOP\n2、用于大型项目Web应用\n3、模型使用方便\n4、开发速度快、运行速度也快。性能优异且功能丰富。\n5、使用命令行工具\n\n缺点：\n1、对Model层的指导和考虑较少\n2、文档实例较少\n3、英文太多\n4、要求PHP技术精通，OOP编程要熟练。\n5、View并不是理想view，理想中的view可能只是html代码，不会涉及PHP代码\n```\n\n27、 TP框架和Laravel框架的区别\n\n```bash\n1、提交数据的方式\nLaravel在提交表单时需要在表单中加入{csrf_field}来防止跨域攻击，而TP不会。\n\n2、路由\nLaravel必须先定义，再使用，路由文件为routes.php；\nTP在配置文件中开启路由后，路由格式是：'路由表达式' => '路由地址和参数'（使用路由的前提是URL支持phthinfo并且开启路由），路由可以使URL更符合SEO。\n\n3、渲染模版方式\n在Laravel框架里，使用return view()来渲染模版；\n而ThinkPHP里则使用了$this->display()的方式渲染模版。\n\n4、操作数据库方式\n都可以使用实例化（建立相对应的模型类）和DB:table('表名')来操作数据库，使用原生查询时不太相同，Laravel使用Db::操作('原生sql')，\nTP使用Db::query('原生sql')。\n\n5、条件判断语句书写方式\nLaravel框架里 if else判断语句和foreach语句 书写时必须以@if开头 以@endif结尾,如果没有则报语法错误,@foreach @endforeach同理。\n而TP框架则和PHP语法规则使用方式一致直接ifesle语句判断和foreach循环遍历\n\n6、中间件，Laravel特点，可以实现访问前后的处理，例如请求和返回，权限认证等;\n\n7、Laravel升级十分简易，而TP大版本的升级要重构代码。\n```\n\n28、 php 的垃圾回收机制\n\n```bash\nPHP 可以自动进行内存管理，清除不需要的对象。\n\nPHP 使用了引用计数 (reference counting) GC 机制。\n\n每个对象都内含一个引用计数器 refcount，每个 reference 连接到对象，计数器加 1。当 reference 离开生存空间或被设为 NULL，计数器减 1。当某个对象的引用计数器为零时，PHP 知道你将不再需要使用这个对象，释放其所占的内存空间。\n```\n\n29、什么是composer？以及composer是干什么用的？工作原理\n\n```bash\ncomposer是PHP的包管理、包依赖关系管理工具\n很轻松一个命令就可以把他人优秀的代码用到我们的项目中来，而且很容易管理依赖关系，更新删除等操作也很轻易的实现。\ncomposer原理理解\n加载的三阶段：\n1、require或者include\n2、__autoload\n3、spl_autoload_register，支持回调\n原理，执行composer install 的时候读取 composer.json里的配置。先去镜像网站上拉取，如果没有直接去github上拉取。成功后会在当前的目录下创建一个vendor的目录，他的原理是通过composer的\nspl_autoload_register调用 loadClass -> findFile -> findFileWithExtension来实现\n```\n\n30、 PHP如何实现静态化 \n\n```bash\n1、通过buffer来实现\n需要用file_put_contents ob_get_clean()等内置函数\nob_start ();\ninclude \"filterpost.html\";\n$mtime = filemtime(\".\u002Ffilterpost.html\");\u002F\u002F在这里可以判断文件是否存在和过期，然后做缓存或者生成静态文件操作\n$pageCache = str_replace('submit2','login',ob_get_contents());\u002F\u002F将缓存去中的内容替换\nob_end_clean();\necho $mtime;\necho $pageCache;\n\n2、通过$_SERVER['PATH_INFO']来实现\necho '\u003Cpre>';\nprint_r($_SERVER);\npreg_match('\u002F^\\\u002F(\\d+)\\\u002F(\\d+)\\.html\u002F',$_SERVER['PATH_INFO'],$arr);\nprint_r($arr);\n \n3、通过Apache配置来实现\n需要开启rewrite重写模块，通过rewrite来配置vhost。\nRewriteEngine on \nRewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d \nRewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f \nRewriteRule ^\u002Fdetail\u002F([0-9]*).html$ \u002Fdetail.php?id=$1\n如果服务器下不存在文件夹及其文件，那么就重写定义到\u002Fdetail.php，如果没有detail文件夹下的1.html 那么就重写定义到.\u002Fdetail.php。\n\n4、通过Nginx配置来实现\nrewrite ^\u002Fdetail\u002F(\\d+)\\.html$ \u002Fdetail.php?id=$1 last;\n```\n\n31、 PHP的优化方案 \n\n```bash\n1、程序代码优化\n2、服务器优化\n3、数据库优化\n4、业务优化\n5、前端优化\n后期细说\n```\n\n32、 了解RESTful API吗？说说干什么用的。 \n\n```bash\nRESTful是一种设计模式，或者说是一种设计规范，它并没有太多强制性的要求之类的，实际上它有的只是几个原则，当一个应用满足这些原则的时候，可以认为它是RESTful的。\n这些规范包括：\n模型表示（Representations）\n消息（Messages）\nURIs\n一致接口（Uniform interface）\n无状态（Stateless）\n资源之间的链接（Links between resources）\n缓存（Caching）\n\n优点：\n1.适合开放性高的API。\n2.行为和资源分离，更容易理解。\n3.提出使用版本号（例如v1、v2），更加规范。\n缺点：\n1.对后端开发人员要求高，业务逻辑有时难以被抽象为资源的增删改查。\n2.对前端开发人员不友好，API粒度较粗，难以查询符合特殊要求的数据，同样的业务要比普通的API需要更多次HTTP请求。\n```",null,0,546,"",1,"2020-03-23 09:59:07","2026-04-19 15:06:43",129,"PHP",{"id":23,"title":24},68,"MySQL常见知识点整理",{"id":26,"title":27},70,"Laravel框架DB常见使用",[29,31],{"id":30,"name":21},25,{"id":32,"name":33},62,"面试",8053,20,3,"https:\u002F\u002Ftp.myong.top\u002Fstorage\u002Farticle\u002F47\u002F7aaf5aeee68d3e4794a17c6d5b2eea.jpg",[39,44,49,54,59],{"id":40,"title":41,"create_time":42,"description":43},93,"PHP执行Python脚本解压，压缩文件夹操作","2020-08-06 14:59:05","PHP是有解压缩类文件的，但在实际项目中，用户方使用Python脚本压缩，很容易出现中文解压乱码，导致文件内容丢失的情况，本文主要介绍PHP执行Python脚本解压缩出现的问题以及解决方法",{"id":45,"title":46,"create_time":47,"description":48},92,"PHP对图片的处理","2020-07-30 15:53:38","图片处理函数功能：缩放、剪切、相框、水印、锐化、旋转、翻转、透明度、反色处理并保存历史记录的思路：当有图片有改动时自动生成一张新图片",{"id":50,"title":51,"create_time":52,"description":53},96,"PHP中字符串跟0做比较永远是true","2021-02-04 16:16:27","最近在项目中做数据对比的功能，发现一个特殊的情况，0跟任何字符串做比较永远返回true，特意了解了一下。",{"id":55,"title":56,"create_time":57,"description":58},13,"Win系统下配置PHP链接Oracle","2019-01-17 22:23:36","该文章内容主要介绍window系统下，php连接oracle的配置。",{"id":60,"title":61,"create_time":62,"description":63},103,"面向对象三大特性五大原则 + 低耦合高内聚[转载]","2021-10-31 23:18:58","面向对象的三大特性是\"封装、\"多态\"、\"继承\"，五大原则是\"单一职责原则\"、\"开放封闭原则\"、\"里氏替换原则\"、\"依赖倒置原则\"、\"接口分离原则\"。",1783431661782]