[{"data":1,"prerenderedAt":66},["ShallowReactive",2],{"article-67":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":37,"read_time":38,"comments":17,"cover":39,"relevant":40},67,"PHP面试题之代码设计类","PHP,面向对象","\n1、创建多级目录函数\n\n\n",2,"\n1、创建多级目录函数\n\n```php\n\u002F**\n * 创建多级目录\n * @param $path string 要创建的目录\n * @param $mode int 创建目录的模式，在windows下可忽略\n *\u002F\nfunction create_dir($path,$mode = 0777)\n{\n    if (is_dir($path)) {\n        # 如果目录已经存在，则不创建\n        echo \"该目录已经存在\";\n    } else {\n        # 不存在，创建\n        if (mkdir($path,$mode,true)) {\n            echo \"创建目录成功\";\n        } else {\n            echo \"创建目录失败\";\n        }\n    }\n}\n```\n\n2、写出smarty模板的特点\n\n```php\n速度快、编译型、缓存技术、插件机制、强大的表现逻辑\n```\n\n3、确保多个进程同时写入同一文件成功\n\n核心思路：加锁\n\n```php\nfunction writeToFile($path, $content){\n    $fp = fopen($path, \"w+\");\n    if (flock($fp, LOCK_EX)) {\n        \u002F\u002F获得写锁，写数据\n        fwrite($fp, $content);\n        \u002F\u002F 解除锁定\n        flock($fp, LOCK_UN);\n    } else {\n        echo \"file is locking...\";\n    }\n    fclose($fp);\n}\n```\n\n4、尽可能高效的从一个标准url里取出文件的扩展名\n\n```php\neg:http:\u002F\u002Fwww.sina.com.cn\u002Fabc\u002Fde\u002Ffg.php?id=1\n取出php或.php\n```\n\n```php\n\u002F\u002F 方案一\nfunction getExtension1($url){\n    $arr = parse_url($url);\n    \u002F\u002FArray ( [scheme] => http [host] => www.sina.com.cn [path] => \u002Fabc\u002Fde\u002Ffg.php [query] => id=1 )\n    $file = basename($arr['path']);\n    $ext = explode('.', $file);\n    return $ext[count($ext)-1];\n}\n\u002F\u002F 方案二\nfunction getExtension2($url){\n    $url = basename($url);\n    $pos1 = strpos($url, '.');\n    $pos2 = strpos($url, '?');\n    if (strstr($url, '?')) {\n        return substr($url, $pos1 + 1, $pos2 - $pos1 - 1);\n    } else {\n        return substr($url, $pos1);\n    }\n}\n```\n\n 相关题目：使用五种以上方式获取一个文件的扩展名，要求：dir\u002Fupload.image.jpg，找出.jpg或者jpg，必须使用PHP自带的处理函数进行处理，方法不能明显重复，可以封装成函数，比如getExtension1(file_name) \n\n5、遍历一个文件夹下的所有文件和子文件夹\n\n```php\nfunction my_scandir($dir){\n    $files = array();\n    if(is_dir($dir)){\n        if ($handle = opendir($dir)) {\n            while (($flie = readdir($handle)) !== false) {\n                if ($flie != \".\" && $file != \"..\") {\n                    if (is_dir($dir . \"\u002F\" . $file)) {\n                        $files[$file] = my_scandir($dir . \"\u002F\" . $file);\n                    } else {\n                        $files[] = $dir . \"\u002F\" . $file;\n                    }\n                }\n            }\n            closedir($handle);\n            return $files;\n        }\n    }\n}\n```\n\n6、无限极分类实现\n\n相关数据表\n\n```bash\nCREATE TABLE category(\n    cat_id smallint unsigned not null auto_increment primary key comment'类别ID',\n    cat_name VARCHAR(30)NOT NULL DEFAULT''COMMENT'类别名称',\n    parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0 COMMENT'类别父ID'\n)engine=MyISAM charset=utf8;\n```\n\n程序实现，递归遍历\n\n```php\nfunction tree($arr, $pid = 0, $level = 0){\n    static $list = array();\n    foreach ($arr as $v) {\n        \u002F\u002F如果是顶级分类，则将其存到$list中，并以此节点为根节点，遍历其子节点\n        if ($v['parent_id'] == $pid) {\n            $v['level'] = $level;\n            $list[] = $v;\n            tree($arr, $v['cat_id'], $level + 1);\n        }\n    }\n    return $list;\n}\n```\n\n7、正则表达式过滤网页上所有的js\u002Fvbs脚本\n\n```php\nheader(\"content-type:text\u002Fhtml;charset=utf-8\");\n$script = \"以下内容不显示：\u003Cscript type='text\u002Fjavascript'>alert('cc');\u003C\u002Fscript>\";\n$pattern = '\"\u003Cscript[^>]*?>.*?\u003C\u002Fscript>\"si';\necho preg_replace($pattern, \"脚本内容\", $script);\u002F\u002F以下内容不显示：脚本内容\n```\n\n8、用正则表达式除去文本内容中所有的HTML标记\n\n 方案一，使用PHP内建函数strip_tags()除去HTML标签 \n\n方案二：\n\n```php\nheader(\"content-type:text\u002Fhtml;charset=utf-8\");\nfunction strip_html_tags($str){\n    $pattern = '\u002F\u003C(\"[^\"]*\"|\\'[^\\']\\*\\'|[^>\"\\'])*>\u002F';\n    return preg_replace($pattern,'',$str);\n}\n\n\u002F\u002F 实例\n$html = '\u003Cp id=\"\">ddddd\u003Cbr \u002F>\u003C\u002Fp>';\necho strip_html_tags($html);\necho \"\u003Cbr \u002F>\";\n\n$html = '\u003Cp id=\">\">bb\u003Cbr \u002F>aaa\u003Cbr \u002F>\u003C\u002Fp>';\necho strip_html_tags($html);\n```\n\n9、使用正则表达式提取html或xml代码中指定标签的指定属性值（需考虑属性值对不规则的情况，如大小写不敏感，属性名值与等号间有空格等）\n\n假设需提取test标签的attr属性值\n\n```html\neg:\u003Ctest2 attr='ddd'attr2='ddd2't1=\\\"t1 value\\\"t2='t2 value'>\n```\n\n```php\nheader(\"content-type:text\u002Fhtml;charset=utf-8\");\nfunction getAttrValue($str, $tagName, $attrName){\n    $pattern1 = \"\u002F\u003C\".$tagName.\"(\\\\s+\\\\w+\\s*=\\\\s*([\\\\'\\\\\\\"]?)([^\\\\'\\\\\\\"]*)(\\\\2))*\\\\s+\".$attrName.\"\\\\s*=\\\\s*([\\\\'\\\\\\\"]?)([^\\\\'\\\\\\\"]*)(\\\\5)(\\\\s+\\\\w+\\\\s*=\\\\s*([\\\\'\\\\\\\"]?)([^\\\\'\\\\\\\"]*)(\\\\9))*\\\\s*>\u002Fi\";\n    $arr = array();\n    $re  = preg_match($pattern1, $str, $arr);\n    if($re){\n        echo\"\u003Cbr\u002F>\\$arr[6]={$arr[6]}\";\n    }else{\n        echo\"\u003Cbr\u002F>not found\";\n    }\n}\n\n\u002F\u002F 示例\n$str1=\"\u003Ctest attr = ' ddd'>\";\ngetAttrValue($str1,\"test\",\"attr\");\u002F\u002F找test标签中attr属性的值,结果为ddd\n\n$str2=\"\u003Ctest2 attr='ddd' attr2='ddd2' t1=\\\"t1 value\\\"t2='t2 value'>\";\ngetAttrValue($str2,\"test2\",\"t1\");\u002F\u002F找test2标签中t1属性的值，结果为t1 value\n```\n\n10、如何判断一个字符串是否是合法的日期格式\n\n```php\nfunction checkDateTime($data){\n    if (date('Y-m-d H:i:s',strtotime($data)) == $data) {\n        return true;\n    } else {\n        return false;\n    }\n}\n\n\u002F\u002F 示例\n$data = '2015-06-20 13:35:42';\nvar_dump(checkDateTime($data));\u002F\u002Fbool(true)\n\n$data = '2015-06-36 13:35:42';\nvar_dump(checkDateTime($data));\u002F\u002Fbool(false)\n```\n\n11、取出上个月的最后一天\n\n```php\ndate_default_timezone_set('PRC');\n\u002F**\n * 获取给定月份的上一月最后一天\n * @param $date string 给定日期\n * @return string 上一月最后一天\n *\u002F\nfunction get_last_month_last_day($date = ''){\n    if ($date != '') {\n        $time = strtotime($date);\n    } else {\n        $time = time();\n    }\n    $day = date('j', $time);\u002F\u002F获取该日期是当前月的第几天\n    return date('Y-m-d', strtotime(\"-{$day} days\", $time));\n}\n\n\u002F\u002F 测试\necho get_last_month_last_day();\necho \"\u003Cbr \u002F>\";\necho get_last_month_last_day(\"2013-3-21\");\n```\n\n12、将时间变成unix时间戳\n\n```php\ndate_default_timezone_set(\"PRC\");\n\u002F\u002F 将字符串转成Unix时间戳\n$unix_time = strtotime(\"2009-9-2 10:30:45\");\necho $unix_time;\necho \"\u003Cbr \u002F>\";\n\u002F\u002F 格式化Unix时间戳为正常时间格式\necho date(\"Y-m-d H:i:s\",$unix_time);\n```\n\n13、把GB2312格式字符串转换成UTF-8格式\n\n```php\niconv('GB2312', 'UTF-8', '时间');\n```\n\n参考文章：\n\n[php面试题之PHP核心技术](https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F99748538)\n",null,0,537,"",1,"2020-04-01 09:55:05","2026-04-19 15:05:59",140,"PHP",{"id":23,"title":24},66,"Nginx解决访问图片显示404，403问题",{"id":26,"title":27},68,"MySQL常见知识点整理",[29,31,34],{"id":30,"name":21},25,{"id":32,"name":33},62,"面试",{"id":35,"name":36},63,"核心技术",2980,7,"https:\u002F\u002Ftp.myong.top\u002Fstorage\u002Farticle\u002Fa6\u002Fb893ca219d1ce6b4b96a91423a9b3f.jpg",[41,46,51,56,61],{"id":42,"title":43,"create_time":44,"description":45},93,"PHP执行Python脚本解压，压缩文件夹操作","2020-08-06 14:59:05","PHP是有解压缩类文件的，但在实际项目中，用户方使用Python脚本压缩，很容易出现中文解压乱码，导致文件内容丢失的情况，本文主要介绍PHP执行Python脚本解压缩出现的问题以及解决方法",{"id":47,"title":48,"create_time":49,"description":50},92,"PHP对图片的处理","2020-07-30 15:53:38","图片处理函数功能：缩放、剪切、相框、水印、锐化、旋转、翻转、透明度、反色处理并保存历史记录的思路：当有图片有改动时自动生成一张新图片",{"id":52,"title":53,"create_time":54,"description":55},96,"PHP中字符串跟0做比较永远是true","2021-02-04 16:16:27","最近在项目中做数据对比的功能，发现一个特殊的情况，0跟任何字符串做比较永远返回true，特意了解了一下。",{"id":57,"title":58,"create_time":59,"description":60},13,"Win系统下配置PHP链接Oracle","2019-01-17 22:23:36","该文章内容主要介绍window系统下，php连接oracle的配置。",{"id":62,"title":63,"create_time":64,"description":65},103,"面向对象三大特性五大原则 + 低耦合高内聚[转载]","2021-10-31 23:18:58","面向对象的三大特性是\"封装、\"多态\"、\"继承\"，五大原则是\"单一职责原则\"、\"开放封闭原则\"、\"里氏替换原则\"、\"依赖倒置原则\"、\"接口分离原则\"。",1783431662170]