PHP 面向对象单例模式记录

1.单例模式就是设计的类最多只能得到一个对象

2.单例模式的设计规范是“三私一公”

私有化构造方法: 禁止在类的外部无限实例化对象

私有化克隆方法: 禁止对象无限克隆对象

私有化静态属性: 保存类内部实例化得到的对象 (防止被外部更改)

公有化静态方法: 允许外部通过调用类内部方法获取对象

该方法内大致逻辑 获取静态属性,验证是否已经实例化为当前类对象,如果实例化则返回该属性,如果未实例化则 new self();赋值给该属性并返回

3.单例模式如果还有其他诉求,可以在类中增加相应的其他类成员(方法)

4.单例模式的目的是为了保护资源的唯一性

<?php

class demo
{

    //私有化静态属性
    private static $obj = null;

    //私有化构造方法,防止外部实例化
    private function __construct(){}

    //共有获取实例方法
    public static function getInstance()
    {
        if(self::$obj instanceof demo){
            return self::$obj;
        }else{
            self::$obj=new self();
            return self::$obj;
        }

    }

    //私有化克隆方法,防止外部克隆实例
    private function __clone(){}

}

$demo=demo::getInstance();
$demo1=demo::getInstance();

var_dump($demo);
var_dump($demo1);
//object(demo)#1 (0) { } object(demo)#1 (0) { }
标签: 单例模式

杨佳乐 发布于  2024-4-30 10:46 

php 面向对象工厂模式记录 PHP

工厂模式是一种按需生产对象的模式

工厂模式通常是需要在大型项目中,会出现很多相同功能的类,此时可以使用工厂产生对象

工厂模式的有点是能够方便后期对类的维护(更名)

工厂模式的缺点是随着功能的增加,会需要增加很多开发量(开发多个工厂)

demo

<?php

class man{

    public function display(){
        echo '这是男人类<br/>';
    }

}

class woman{

    public function display(){
        echo '这是女人类<br/>';
    }

}

//工厂类
class factory{

    //工厂方法,专门生产类的对象 (默认1)
    /*public function getInstance($classname){
        return new $classname();
    }*/

    //静态工厂方法,专门生产类的对象 (默认2)
    /*public static function getInstance($classname){
        return new $classname();
    }*/

    //封装匿名工厂方法
    public static function getInstance($flag){

        switch ($flag){
            case "m":
                return new man();
            case "w":
                return new woman();
            default:
                return  null;
        }

    }

}

//默认1调用方式,需要实例化工厂类,且无法解决类更名需要改动很多地方的缺点
/*$f=new factory();
$man=$f->getInstance('man');
$man->display();

$woman=$f->getInstance('woman');
$woman->display();*/

//默认2调用模式,无需实例化工厂类,但无法解决类更名需要改动很多地方的缺点
/*$man=factory::getInstance('man');
$man->display();
$woman=factory::getInstance('woman');
$woman->display();*/

//封装匿名调用模式 当man / woman类名变更时,可以很方便的更改,并且可隐藏类的真实名称
$man=factory::getInstance('m');
$man->display();
$woman=factory::getInstance('w');
$woman->display();
标签: 工厂模式

杨佳乐 发布于  2024-4-30 10:45 

vscode 远程开发 + xdebug 调试php代码 (webman框架) PHP

vscode 使用ssh远程开发,连接远程服务器

服务器使用centos + php8 + mysql5.7

使用宝塔管理服务器

1.安装php xdebug扩展

2.修改php.ini文件

3.使用vscode安装php debug插件 (远程开发需要安装到远程ssh上)

4.vscode中设置远程php路径

5.设置 修改端口


6.点击绿色开始按钮,然后运行webman程序 php start.php start

增加断点调试即可


杨佳乐 发布于  2024-4-30 10:41 

php 使用mongoDB PHP

使用宝塔安装mongoDB

  • 注意需要设置使用内存上线,否则将会自动关闭mongoDB服务
storage:
  dbPath: /www/server/mongodb/data
  directoryPerDB: true

  journal:
    enabled: true
  wiredTiger:
    engineConfig:
      cacheSizeGB: 1

主要是 wiredTiger内容

开放mongoDB,使用本地navicat 等工具连接远程服务器

服务端开放27017端口

mongoDB配置项bind ip 更改为0.0.0.0

mongoDB设置认证权限

think-orm 操作mongoDB示例,跟操作普通数据库一样

$adduser = [
'name'=>'tpormname',
'age'=>30,
];

//使用table不会带设置的前缀,使用name会自动增加前缀

//添加数据
Db::connect('mongo')->table('user')->insert($adduser);
//分页查询数据
$res = Db::connect('mongo')->table('user')->paginate(2);
//查询列表
$list = Db::name("request_log")->limit(10)->select();

think-orm 配置示例

return [
'default' => 'mysql',
'connections' => [
'mysql' => [
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => getenv('DB_HOST'),
// 数据库名
'database' => getenv('DB_NAME'),
// 数据库用户名
'username' => getenv('DB_USER'),
// 数据库密码
'password' => getenv('DB_PASSWORD'),
// 数据库连接端口
'hostport' => getenv('DB_PORT'),
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => getenv('DB_PREFIX'),
// 断线重连
'break_reconnect' => true,
//是否严格检查字段是否存在
'fields_strict'  => false,
// 关闭SQL监听日志
'trigger_sql' => false,
// 自定义分页类
'bootstrap' =>  ''
],
'mongo' => [
'type' => 'mongo',
'hostname' => '127.0.0.1',
'hostport' => '27017',
'charset'  => 'utf8',
'database' => 'test',
'username' => '',
'password' => '',
// 数据库表前缀
'prefix' => getenv('DB_PREFIX'),
],
],
];
标签: mongoDB

杨佳乐 发布于  2024-4-30 10:32