PHP中的ReflectionClass讲解【详细版】
快餐: ReflectionClass精简版
在PHP中,ReflectionClass
是一个功能强大的反射类,它就像是一个类的“X光透视镜”,能让我们在程序运行时深入了解类的内部结构和各种细节。
一、反射类的基本概念和重要性
反射是指在程序运行期间获取关于类、对象、方法和属性等元素的信息,并能够对这些元素进行操作的能力。ReflectionClass
主要用于反射类相关的信息。这在很多高级编程场景中非常关键,比如在框架开发中,当需要动态加载模块、自动处理依赖关系或者实现插件系统时,就需要用到ReflectionClass
来对类进行动态的分析和操作。
二、详细使用步骤
1. 实例化ReflectionClass
- 实例化是使用这个类的第一步。可以通过两种方式来实例化
ReflectionClass
。一种是传递类名(以字符串形式),另一种是传递一个类的对象。 - 例如:
class MyExampleClass {public $exampleProperty;public function exampleMethod() {return "This is an example method";} } // 通过类名实例化 $reflectionByName = new ReflectionClass('MyExampleClass'); // 通过类对象实例化 $myObject = new MyExampleClass(); $reflectionByObject = new ReflectionClass($myObject);
2. 获取类名相关信息
- 使用
getName()
方法可以获取被反射类的名称。 - 例如:
$class_name_from_name = $reflectionByName->getName(); $class_name_from_object = $reflectionByObject->getName(); echo "通过类名获取的类名: ".$class_name_from_name."<br>"; echo "通过对象获取的类名: ".$class_name_from_object."<br>";
3. 获取类的属性信息
- 获取所有属性
getProperties()
方法会返回一个包含ReflectionProperty
对象的数组,每个对象对应类的一个属性,包括公有、私有和受保护的属性。- 例如:
$propertiesArray = $reflectionByName->getProperties(); foreach ($propertiesArray as $property) {echo "属性名: ".$property->getName()."<br>"; }
- 获取公有属性及其默认值
getDefaultProperties()
方法用于获取类的默认属性(公有属性)及其默认值,它返回一个关联数组,键是属性名,值是属性的默认值。- 例如:
$defaultPropertiesArray = $reflectionByName->getDefaultProperties(); print_r($defaultPropertiesArray);
4. 获取类的方法信息
- 获取所有方法
getMethods()
方法返回一个包含ReflectionMethod
对象的数组,每个对象代表类的一个方法,这些方法包括从父类继承来的方法。- 例如:
$methodsArray = $reflectionByName->getMethods(); foreach ($methodsArray as $method) {echo "方法名: ".$method->getName()."<br>"; }
- 获取公有方法
getPublicMethods()
方法只返回类中的公有方法。- 例如:
$publicMethodsArray = $reflectionByName->getPublicMethods(); foreach ($publicMethodsArray as $publicMethod) {echo "公有方法名: ".$publicMethod->getName()."<br>"; }
5. 创建类的对象和调用方法
- 创建对象
- 使用
newInstance()
方法可以创建被反射类的一个新对象。如果类的构造函数有参数,需要传递相应的参数给newInstance()
方法。 - 例如:
$newObject = $reflectionByName->newInstance();
- 使用
- 调用方法
- 首先通过
getMethod()
方法获取ReflectionMethod
对象,然后使用invoke()
方法来调用这个方法。如果方法有参数,需要将参数传递给invoke()
方法。 - 例如:
$methodToCall = $reflectionByName->getMethod('exampleMethod'); $result = $methodToCall->invoke($newObject); echo "方法调用结果: ".$result."<br>";
- 首先通过
6. 检查类的继承关系
- 获取父类
getParentClass()
方法返回代表父类的ReflectionClass
对象,如果没有父类,则返回null
。- 例如:
$parentClassObject = $reflectionByName->getParentClass(); if ($parentClassObject) {echo "父类名称: ".$parentClassObject->getName()."<br>"; } else {echo "该类没有父类<br>"; }
- 检查是否实现了某个接口
implementsInterface()
方法用于检查类是否实现了指定的接口。它接受接口名(字符串)作为参数,返回true
或false
。- 例如:
$interfaceName = 'SomeInterface'; $implementsInterfaceResult = $reflectionByName->implementsInterface($interfaceName); if ($implementsInterfaceResult) {echo "该类实现了指定接口<br>"; } else {echo "该类未实现指定接口<br>"; }
三、实际应用场景示例
假设我们正在开发一个简单的插件系统。我们有一个主应用程序,它允许用户加载不同的插件(以类的形式存在)。通过ReflectionClass
,我们可以在加载插件时检查插件类的结构。
例如,我们定义一个插件接口PluginInterface
,要求所有插件类都实现execute()
方法。当用户上传一个新的插件类文件时,我们可以使用ReflectionClass
来检查这个类是否实现了PluginInterface
接口,并且可以获取execute()
方法的信息,动态地调用这个方法来执行插件的功能。这就使得我们的主应用程序可以很灵活地处理各种不同的插件,而不需要提前知道插件的具体内容。
interface PluginInterface {public function execute();
}class MyPlugin implements PluginInterface {public function execute() {echo "Plugin executed successfully";}
}$pluginReflection = new ReflectionClass('MyPlugin');
if ($pluginReflection->implementsInterface('PluginInterface')) {$pluginObject = $pluginReflection->newInstance();$pluginMethod = $pluginReflection->getMethod('execute');$pluginMethod->invoke($pluginObject);
}
通过这样的方式,ReflectionClass
为我们在PHP编程中提供了强大的动态处理类的能力,让我们的程序更加灵活和可扩展。
四、ReflectionClass的实际应用场景
ReflectionClass
在PHP中有着广泛的实际应用场景,下面为你详细介绍几个常见的场景。
1. 依赖注入容器
依赖注入容器是一种设计模式,用于管理对象的创建和依赖关系。ReflectionClass
可以帮助容器自动解析类的依赖项。
<?php// 定义一个接口
interface Logger {public function log($message);
}// 实现接口
class FileLogger implements Logger {public function log($message) {echo "Logging to file: $message". PHP_EOL;}
}// 定义一个需要依赖 Logger 的类
class UserService {private $logger;public function __construct(Logger $logger) {$this->logger = $logger;}public function createUser($username) {$this->logger->log("User $username created");echo "User $username created successfully". PHP_EOL;}
}// 依赖注入容器类
class Container {private $bindings = [];public function bind($abstract, $concrete) {$this->bindings[$abstract] = $concrete;}public function make($abstract) {if (isset($this->bindings[$abstract])) {$concrete = $this->bindings[$abstract];return $this->resolve($concrete);}return $this->resolve($abstract);}private function resolve($concrete) {$reflectionClass = new ReflectionClass($concrete);$constructor = $reflectionClass->getConstructor();if (!$constructor) {return $reflectionClass->newInstance();}$parameters = $constructor->getParameters();$dependencies = [];foreach ($parameters as $parameter) {$dependency = $parameter->getClass();if ($dependency) {$dependencies[] = $this->make($dependency->getName());}}return $reflectionClass->newInstanceArgs($dependencies);}
}// 使用容器
$container = new Container();
$container->bind(Logger::class, FileLogger::class);$userService = $container->make(UserService::class);
$userService->createUser('JohnDoe');
在这个例子中,Container
类使用ReflectionClass
来解析UserService
类的构造函数参数,并自动创建所需的依赖项。
2. 自动化测试框架
自动化测试框架需要动态地发现和执行测试用例。ReflectionClass
可以帮助框架找到所有测试类和测试方法。
<?php// 定义一个测试基类
abstract class TestCase {public function run() {$reflectionClass = new ReflectionClass($this);$methods = $reflectionClass->getMethods(ReflectionMethod::IS_PUBLIC);foreach ($methods as $method) {if (str_starts_with($method->getName(), 'test')) {$this->{$method->getName()}();}}}
}// 定义一个测试类
class MyTest extends TestCase {public function testAddition() {$result = 1 + 1;assert($result === 2, '1 + 1 should equal 2');echo "Test testAddition passed". PHP_EOL;}public function testSubtraction() {$result = 2 - 1;assert($result === 1, '2 - 1 should equal 1');echo "Test testSubtraction passed". PHP_EOL;}
}// 运行测试
$test = new MyTest();
$test->run();
在这个例子中,TestCase
类使用ReflectionClass
来查找所有以test
开头的公共方法,并依次执行这些方法。
3. 数据验证和序列化
在处理数据验证和序列化时,ReflectionClass
可以帮助我们自动验证和序列化对象的属性。
<?phpclass User {public $name;public $age;public function __construct($name, $age) {$this->name = $name;$this->age = $age;}
}function validateAndSerialize($object) {$reflectionClass = new ReflectionClass($object);$properties = $reflectionClass->getProperties(ReflectionProperty::IS_PUBLIC);$data = [];foreach ($properties as $property) {$propertyName = $property->getName();$value = $property->getValue($object);// 简单的验证示例if ($propertyName === 'age' && $value < 0) {throw new InvalidArgumentException("Age cannot be negative");}$data[$propertyName] = $value;}return json_encode($data);
}$user = new User('Alice', 25);
try {$serialized = validateAndSerialize($user);echo "Serialized data: $serialized". PHP_EOL;
} catch (InvalidArgumentException $e) {echo $e->getMessage(). PHP_EOL;
}
在这个例子中,validateAndSerialize
函数使用ReflectionClass
来获取对象的所有公共属性,并对属性值进行验证和序列化。
相关文章:
PHP中的ReflectionClass讲解【详细版】
快餐: ReflectionClass精简版 在PHP中,ReflectionClass是一个功能强大的反射类,它就像是一个类的“X光透视镜”,能让我们在程序运行时深入了解类的内部结构和各种细节。 一、反射类的基本概念和重要性 反射是指在程序运行期间获…...
嵌入式面试题解析:常见基础知识点详解
在嵌入式领域的面试中,基础知识点的考察尤为重要。下面对一些常见面试题进行详细解析,帮助新手一步步理解。 一、原码、反码、补码及补码的好处 题目 什么叫原码、反码、补码?计算机学科引入补码有什么好处? 在计算机科学中&a…...
GPU渲染阶段介绍+Shader基础结构实现
GPU是什么 (CPU)Center Processing Unit:逻辑编程 (GPU)Graphics Processing Unit:图形处理(矩阵运算,数据公式运算,光栅化) 渲染管线 渲染管线也称为渲染流水线&#x…...
08-DevOps-向Harbor上传自定义镜像
harbor创建完成,往harbor镜像仓库中上传自定义的镜像,包括新建项目、docker配置镜像地址、镜像重命名、登录harbor、推送镜像这几个步骤,具体操作如下: harbor中新建项目 访问级别公开,代表任何人都可以拉取仓库中的镜…...
C++学习之路,从0到精通的征途:vector类的模拟实现
目录 一.vector的介绍 二.vector的接口实现 1.成员变量 2.迭代器 (1)begin (2)end 3.容量操作 (1)size,capacity (2)reserve (3)resize…...
嵌入式软件--stm32 DAY 2
大家学习嵌入式的时候,多多学习用KEIL写代码,虽然作为编译器,大家常用vscode等常用工具关联编码,但目前keil仍然是主流工具之一,学习掌握十分必要。 1.再次创建项目 1.1编译器自动生成文件 1.2初始文件 这样下次创建新…...
多模态大语言模型arxiv论文略读(二十九)
Temporal Insight Enhancement: Mitigating Temporal Hallucination in Multimodal Large Language Models ➡️ 论文标题:Temporal Insight Enhancement: Mitigating Temporal Hallucination in Multimodal Large Language Models ➡️ 论文作者:Li Su…...
【人工智能学习-01-01】20250419《数字图像处理》复习材料的word合并PDF,添加页码
前情提要 20250419今天是上师大继续教育人工智能专升本第一学期的第一次线下课。 三位老师把视频课的内容提炼重点再面授。(我先看了一遍视频,但是算法和图像都看不懂,后来就直接挂分刷满时间,不看了) 今天是面对面授…...
B端APP设计:打破传统限制,为企业开启便捷新通道
B端APP设计:打破传统限制,为企业开启便捷新通道 在数字化转型浪潮中,企业级移动应用正突破传统管理系统的功能边界,演变为连接产业链各环节的核心枢纽。本文从技术架构革新、交互模式进化、安全防护升级三个维度,系统…...
【多线程5】面试常考锁知识点
文章目录 悲观/乐观锁挂起等待锁/自旋锁偏向锁轻量级/重量级锁锁升级CASCAS引发的ABA问题解决方案 原子类 公平/不公平锁可重入锁ReentrantLock读写锁 Callable接口 这里的“悲观”“乐观”“挂起等待”“自旋”“轻量级”“重量级”“公平”“非公平”“可重入”仅代表某个锁的…...
Linux第一个系统程序——进度条
1.回车与换行 回车(CR, \r): 作用:将光标移动到当前行的行首(最左侧),但不换到下一行。 历史来源:源自打字机的“回车”操作——打字机的滑架(Carriage)需…...
C 语 言 --- 指 针 3
C 语 言 --- 指 针 3 函 数 指 针函 数 指 针 数 组代 码 解 释回 调 函 数 - - - qsort模 拟 实 现 qsort 函 数 总结 💻作 者 简 介:曾 与 你 一 样 迷 茫,现 以 经 验 助 你 入 门 C 语 言 💡个 人 主 页:笑口常开x…...
蓝桥杯之递归
1.数字三角形 题目描述 上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和(路径上的每一步只可沿左斜线向下或右斜线向下走)。 输…...
学习笔记十八——Rust 封装
🧱 Rust 封装终极指南:结构体、模块、Trait、目录结构与模块引用 🧭 目录导航 什么是封装?Rust 的封装理念Rust 的封装工具总览模块(mod)和访问控制(pub)详解结构体和枚举ÿ…...
【面试向】点积与注意力机制,逐步编码理解自注意力机制
点积(dot product)两个向量点积的数学公式点积(dot product)与 Attention 注意力机制(Attention)注意力机制的核心思想注意力机制中的缩放点积自注意力机制中,谁注意谁? 逐步编码理解…...
基础数学知识-线性代数
1. 矩阵相乘 c i j = a i k ∗ b k j c_{ij} = a_{ik} * b_{kj} cij=aik∗bkj 1. 范数 1. 向量的范数 任意一组向量设为 x ⃗ = ( x 1 , x 2 , . . . , x N ) \vec{x}=(x_1,x_2,...,x_N) x =(x1,x2,...,xN) 如下: 向量的1范数: 向量的各个元素的绝对值之和∥ …...
【KWDB 创作者计划】_上位机知识篇---Docker容器
文章目录 前言1. Docker 容器是什么?隔离性轻量级可移植性可复用性 2. Docker 核心概念镜像容器仓库Dockerfile 3. Docker 基本使用(1) 安装 Docker(2) 容器生命周期管理(3) 镜像管理(4) 进入容器内部(5) 数据持久化(挂载卷)(6) 网络管理 4. …...
指针函数和函数指针
指针函数本质是一个函数,只是函数的返回值是指针类型 函数指针本质是一个指针,只是这个指针指向的是一个函数 指针函数 函数有很多类型的返回值,例如 short funcA(参数列表) // 表示该函数返回值是一个short类型 void funcA(参数列表) // 表…...
案例驱动的 IT 团队管理:创新与突破之路:第六章 组织进化:从案例沉淀到管理体系-6.1 案例库建设方法论-6.1.2案例分级与标签体系
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 案例分级与标签体系构建方法论:IT团队知识管理的结构化实践1. 案例库建设的战略价值与核心挑战1.1 案例管理的战略定位1.2 分级标签体系的核心价值 2. 案例分级体…...
sqlilabs-Less之HTTP头部参数的注入——基础篇
Less-18 user-agent报错注入 这一关的代码漏洞点出现在了insert语句,因为这里没有对user-agent和ip_address进行过滤,,并且输出了mysql的错误信息 补充知识点 PHP里用来获取客户端IP的变量 $_SERVER[HTTP_CLIENT_IP] #这个很少使用…...
java多线程相关内容
java线程创建的方式 一共有四种方式 继承 Thread 类:本质上是实现了 Runnable 接口的一个实例,代表一个线程的实例 启动线程的唯一方 法就是通过 **Thread 类的 start()**实例方法。start()方法是一个 native 方法,它将启动一个新线 程&…...
Windows Server .NET Core 应用程序部署到 IIS 解决首次访问加载慢的问题
第一篇: Windows .NET Core 应用程序部署到 IIS 解决首次访问加载慢的问题 第二篇:Windows Server .NET Core 应用程序部署到 IIS 解决首次访问加载慢的问题 第三篇:Windows .NET Core 应用程序部署到 IIS 解决首次访问加载慢的问题 设置…...
ubuntu24.04上使用qemu+buildroot+uboot+linux+tftp+nfs模拟搭建vexpress-ca9嵌入式linux开发环境
1 准备工作 1.1 安装依赖工具 sudo apt-get update && sudo apt-get install build-essential git bc flex libncurses5-dev libssl-dev device-tree-compiler1.2 安装arm交叉编译工具链 sudo apt install gcc-arm-linux-gnueabihf安装之后,在终端输入ar…...
Cocos Creater打包安卓App添加隐私弹窗详细步骤+常见问题处理
最终演示效果,包含所有代码内容 + 常见错误问题处理 点击服务协议、隐私政策,跳转到相关网页, 点击同意进入游戏,不同意关闭应用 一,添加Activity,命名为MyLaunchActivity 二,编写MyLaunchActivity.java的内容 package com.cocos.game.launch;import android.os.Bund…...
UI文件上传
1、文件上传:文件上传是自动化中比较麻烦棘手的部分。 有些场景我们需要上传本地文件到项目里。这种比较麻烦,因为需要点开文件上传的窗口后,打开的是windows的文件选择窗口, 而selenium是无法操作这个窗口的。 selenium只能操作…...
2.凸包优化求解
1.减而治之(Decrease and Conquer) 插入排序 典型的减而治之算法就是插入排序方法 插入排序法: 在未排序中选择一个元素,插入到已经排序号的序列中 将凸包也采用减而治之的方法 2.In-Convex-Polygon Test 怎么判断引入的极点存在于多边形里面还是外面࿱…...
从0开发一个unibest+vue3项目,使用vscode编辑器开发,总结vue2升vue3项目开始,小白前期遇到的问题
开头运行可看官网 链接: unibest官网 一:vscode中vue3代码显示报错标红波浪线 去查看扩展商店发现一些插件都弃用了,例如h5的插件以及vue老插件 解决办法:下载Vue - Official插件(注意:横杠两边是要加空格的ÿ…...
jmeter中文乱码问题解决
修改jmeter.properties配置文件 进入JMeter安装目录的bin文件夹,找到jmeter.properties文件。搜索参数sampleresult.default.encodingUTF-8,取消注释(删除行首的#),并将其值改为UTF-8。保存文件并重启JMeter生效…...
额外篇 非递归之美:归并排序与快速排序的创新实现
个人主页:strive-debug 快速排序非递归版本 非递归版本的快速排序是为了解决在空间不够的情况下,利用栈来模拟递归的过程。 递归版本的快速排序是空间换时间,好实现。 实现思路: 1. 创建一个栈,将数组的右边界下标和…...
[文献阅读] EnCodec - High Fidelity Neural Audio Compression
[文献信息]:[2210.13438] High Fidelity Neural Audio Compression facebook团队提出的一个用于高质量音频高效压缩的模型,称为EnCodec。Encodec是VALL-E的重要前置工作,正是Encodec的压缩量化使得VALL-E能够出现,把语音领域带向大…...
JavaSpring 中使用 Redis
创建项目 配置 Redis 服务地址 创建 Controller 类 由于当前只是些简单的测试代码,所以就不进行分层了,只创建一个 Controller 来实现 jedis 通过 jedis 对象里的各种方法来操作 Redis 此处通过 StringRedisTemplate 来操作 Redis 最原始提供的类是 Re…...
B端可视化像企业数据的透视镜,看清关键信息
在数字化时代,数据已成为企业最宝贵的资产之一。然而,数据的价值不仅取决于其数量,更在于企业能否快速、准确地提取关键信息并据此做出决策。B端可视化技术的出现,为企业提供了一种强大的工具,它如同企业的“透视镜”&…...
【愚公系列】《Python网络爬虫从入门到精通》055-Scrapy_Redis分布式爬虫(安装Redis数据库)
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! …...
【MySQL】SQL语句在MySQL中的执行过程?主要存储引擎区别?
MySQL SQL语句执行过程详解 作为面试官,我来详细剖析一条SQL语句在MySQL中的完整执行过程,这是每个后端开发者都应该掌握的核心知识。 一、连接阶段 建立连接 客户端通过TCP/IP协议与MySQL服务器建立连接(默认3306端口)服务器验证用户名、密码和权限…...
致远OA——数据回填表单
文章目录 :apple: 业务需求描述:pineapple: 业务分析和实现 🍎 业务需求描述 测试案例: https://pan.quark.cn/s/3f58972f0a27 官网地址: https://open.seeyoncloud.com/v5devCAP/94/355/359/399/405/406.html 需求描述: 点…...
MongoDB导出和导入数据
安装mongodump工具 参考文章mongodump工具安装及使用详解_mongodump安装-CSDN博客 MongoDB导入导出和备份的命令工具从4.4版本开始不再自动跟随数据库一起安装,而是需要自己手动安装。 官方网站下载链接:Download MongoDB Command Line Database Tools …...
蓝桥杯之递归二
1.数的划分 题目描述 将整数 nn 分成 kk 份,且每份不能为空,任意两份不能相同(不考虑顺序)。 例如:n7,k3n7,k3,下面三种分法被认为是相同的。 1,1,5;1,5,…...
【大疆dji】ESDK开发环境搭建(软件准备篇)
接上一篇【大疆dji】ESDK开发环境搭建(硬件准备篇) 1. 编译环境 ESDK 提供 x86_64/aarch64 基于 Linux 平台 Ubuntu 发行版操作系统构建的静态库,运行 demo 先正确安装所需的依赖包。arm32位就不支持了。建议使用编译安装的方式,…...
Android TTY设备调用流程和简单分析
Linux TTY系统中ioctl的调用流程详解:从应用层到MSM GENI Serial驱动 本文档详细分析Linux系统中从用户空间应用程序发起TTY ioctl请求到特定驱动(例如msm_geni_serial_ioctl)的完整调用流程,包括32位应用与64位内核之间的兼容性问题分析。 1. 总体调用路径概览 以下是完…...
数字孪生赋能管理系统,降本增效立竿见影
1. 数字孪生基础概念及其在管理系统中的应用前景 数字孪生是一种集成多学科、多物理量、多尺度、多概率的仿真过程,在虚拟空间中完成映射,从而反映相对应的实体装备的全生命周期过程。其核心在于将现实世界中的物理对象或系统与其数字化模型相结合&…...
Java学习手册:Web 应用架构概述
一、Web 应用架构的演变 在互联网发展的初期阶段,Web 应用普遍采用客户端 / 服务器(C/S)架构模式。客户端应用程序与服务器端应用程序直接建立连接,进行数据交互和业务处理。然而,这种架构存在诸多局限性。由于客户端…...
企业网站安装 SSL安装的必要性
能够带来安全的加密和快速的访问体验,防止中间人的流量劫持,保障用户隐私信息的安全,帮助用户识别钓鱼网站,提升网站在搜索引擎的排名。 能够防止黑客盗走客户银行卡账号的机密信息,保证信息的机密性,防止…...
【CF】Day38——Codeforces Round 965 (Div. 2) B
B. Minimize Equal Sum Subarrays 题目: 思路: 直觉题 我们可以这样构造,将整个数列左移一位即可,为什么呢? 因为这样我们能尽可能地保证数列的数字尽可能多的同时 且 有一个数不同 这里介绍一个rorate函数…...
leetcode 300. Longest Increasing Subsequence
目录 题目描述 第一步,明确并理解dp数组及下标的含义 第二步,分析明确并理解递推公式 第三步,理解dp数组如何初始化 第四步,理解遍历顺序 代码 题目描述 这是动态规划解决子序列问题的例子。 第一步,明确并理解…...
解密大模型背后的秘密:训练、优化与挑战
解密大模型背后的秘密:训练、优化与挑战 在当今的人工智能领域,大模型(Large Language Models, LLMs)已经成为了一个不可忽视的存在。从自然语言处理到图像生成,再到推荐系统,大模型以其强大的泛化能力和创…...
第33讲|遥感大模型在地学分类中的初探与实战
目录 🧠 一、什么是“遥感大模型”? 📚 二、遥感大模型在地学分类中的优势 📍三、案例:使用 Segment Anything Model (SAM) 进行遥感地物分割 📦 1. 安装与依赖配置(PyTorch) 🖼 2. 读取遥感图像(可用 Sentinel-2 伪彩色图) 🔧 3. SAM 模型载入 💡 …...
LeetCode 438 找到字符串中所有字母异位词
给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 示例 1: 输入: s "cbaebabacd", p "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 "…...
【25软考网工笔记】第二章(6)脉冲编码调制PCM、通信和交换方式
目录 一、脉冲编码调制PCM 1. 脉冲编码调制的数字化过程 1)采样 2)量化 3)编码 2. PCM计算 3. 应用案例 1)例题1 2)例题1 3)例题3 知识小结 二、通信和交换方式 1.数据通信方式分类 1&#x…...
JSON学习笔记
文章目录 1. JSON是什么2. JSON的特点与结构3. JSON的使用4. JSON文件读取 1. JSON是什么 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和…...
高阶指南:动态定价下eBay利润率控制的4维财务模型
在eBay平台上,动态定价(Dynamic Pricing)早已不是新鲜概念。随着市场供需的瞬时波动、竞争产品的变化,以及跨境电商红海局势的加剧,卖家若想在残酷的价格战中保住利润、稳住运营基本盘,仅靠经验主义已经远远…...